吳恩達深度學習復盤(5)神經網絡的前向傳播TesorFlow與NumPy實現比對

數據結構差別

NumPy 和 TensorFlow 在數據表示上的差異展開,結合神經網絡實踐中的常見問題進行說明。以下是詳細解析:

一、簡介

  1. 數據表示的歷史背景

    • NumPy 是 Python 科學計算的基礎庫,早期設計為處理多維數組
    • TensorFlow 由 Google Brain 團隊開發,采用張量(Tensor)作為核心數據結構
    • 兩者在矩陣存儲方式上存在歷史遺留的不一致性
  2. 矩陣維度的關鍵概念

    • 矩陣維度表示為行數×列數(如 2×3 矩陣)
    • 行向量(1×n)與列向量(n×1)的區別
    • NumPy 一維數組(ndarray)與二維矩陣的差異

二、數據結構

  1. NumPy 矩陣表示

    • 二維數組使用嵌套列表創建:X = np.array([[1,2,3], [4,5,6]])
    • 行向量:X = np.array([[200, 17]])(1×2 矩陣)
    • 列向量:X = np.array([[200], [17]])(2×1 矩陣)
    • 一維數組:X = np.array([200, 17])(無行 / 列概念)
  2. TensorFlow 張量特性

    • 張量是多維數組的泛化形式
    • 自動推斷數據類型(如 tf.float32)
    • 形狀信息:tf.TensorShape([1, 3])表示 1×3 矩陣
    • 與 NumPy 的互操作性:tensor.numpy()方法轉換
  3. 維度不一致問題

    • 神經網絡層輸入要求:二維矩陣(樣本 × 特征)
    • 行向量與列向量在矩陣乘法中的不同表現
    • 標量結果在 TensorFlow 中仍為 1×1 矩陣

三、實際使用

  1. 數據轉換注意事項

    • 優先使用二維數組表示特征矩陣
    • 使用np.newaxis顯式增加維度
    • 注意reshape操作對數據布局的影響
  2. 典型場景示例

    • 輸入層:形狀為[樣本數, 特征數]
    • 全連接層輸出:形狀為[樣本數, 神經元數]
    • 標量預測結果:形狀為[樣本數, 1]
  3. 性能優化建議

    • 保持數據在 TensorFlow 內部格式進行計算
    • 批量處理時使用高效的矩陣運算
    • 避免頻繁的 NumPy-Tensor 轉換

四、使用注意分別的特點

  1. 設計哲學差異

    • NumPy 注重通用性和靈活性
    • TensorFlow 強調大規模分布式計算優化
    • 兩者在廣播機制、索引方式等方面存在細節差異
  2. 最佳實踐方案

    • 使用 TensorFlow 原生 API 構建模型
    • 通過 Keras 預處理層統一數據格式
    • 在數據加載階段完成必要的維度調整

五、常見錯誤與解決

  1. 維度不匹配錯誤

    • 錯誤示例:ValueError: Shapes (None, 3) and (None, 2) are incompatible
    • 解決方法:檢查輸入數據維度與模型定義是否一致
  2. 數據類型不匹配

    • 錯誤示例:TypeError: Input 'y' of 'Add' Op has type float64 that does not match type float32
    • 解決方法:統一使用tf.float32數據類型
  3. 隱式維度轉換

    • 注意tf.expand_dimstf.squeeze的正確使用
    • 推薦顯式指定input_shape參數

六、總結

神經網絡實踐中,需要特別注意:

  1. 數據輸入的維度規范性
  2. 框架間轉換的顯式處理
  3. 歷史設計差異帶來的潛在問題

在實際項目中,注意使用 TensorFlow/Keras 的預處理流水線,保持數據在 TensorFlow 生態內流轉,通過單元測試驗證數據維度正確性。這種處理方式可以有效避免因數據表示不一致導致的錯誤,提升模型開發效率和運行穩定性。

TensorFlow的基礎API

一、簡介

  1. TensorFlow 的 Sequential API

    • 提供更簡潔的網絡構建方式
    • 自動處理層間連接關系
    • 替代手動定義每層輸入輸出的顯式寫法
  2. 數據預處理規范

    • 輸入特征矩陣X形狀:[樣本數, 特征數]
    • 目標標簽y形狀:一維數組或[樣本數, 類別數]
    • 數據格式需與模型輸入要求嚴格匹配
  3. 模型訓練流程

    • model.compile()配置訓練參數
    • model.fit()執行訓練循環
    • model.predict()進行推理預測

二、API示例

1.?Sequential
  • 代碼簡化

    model = tf.keras.Sequential([tf.keras.layers.Dense(3, activation='sigmoid'),tf.keras.layers.Dense(1, activation='sigmoid')
    ])
    
    ?
    • 替代顯式層連接:
      layer1 = Dense(3, activation='sigmoid')
      layer2 = Dense(1, activation='sigmoid')
      a1 = layer1(X)
      a2 = layer2(a1)
      
  • 自動推斷輸入形狀

    • 第一層需指定input_shape參數
    • 后續層自動繼承前一層輸出形狀
2.?咖啡分類示例
  • 輸入數據

    X = np.array([[200, 17], [140, 30], [190, 20], [160, 25]])  # 4×2矩陣
    y = np.array([1, 0, 1, 0])  # 一維標簽數組
    
  • 模型構建

    model = tf.keras.Sequential([tf.keras.layers.Dense(3, activation='sigmoid', input_shape=(2,)),tf.keras.layers.Dense(1, activation='sigmoid')
    ])
    
  • 訓練與預測

    model.compile(optimizer='adam', loss='binary_crossentropy')
    model.fit(X, y, epochs=100)
    predictions = model.predict(np.array([[180, 22]]))
    
3.?數字分類示例
  • 輸入數據

    X = np.array([[0.5, 0.2, 0.7], ...])  # 形狀[樣本數, 特征數]
    y = np.array([3, 7, 2, ...])  # 一維整數標簽
    
  • 模型構建

    model = tf.keras.Sequential([tf.keras.layers.Dense(64, activation='relu', input_shape=(3,)),tf.keras.layers.Dense(10, activation='softmax')
    ])
    
  • 訓練配置

    model.compile(optimizer='adam',loss='sparse_categorical_crossentropy',metrics=['accuracy'])
    

三、底層原理

NumPy實現,這個上一篇筆記寫過,這里便于查看重寫了一次。

  1. 模型編譯的核心參數

    • 優化器:指定訓練算法(如 Adam、SGD)
    • 損失函數:定義模型誤差計算方式
    • 評估指標:監控訓練過程的性能指標
  2. 數據預處理最佳實踐

    • 特征標準化:StandardScalerMinMaxScaler
    • 標簽獨熱編碼:to_categorical
    • 數據分批:使用model.fit(X, y, batch_size=32)
  3. 手動實現前向傳播

    def forward_propagation(X, W1, b1, W2, b2):Z1 = np.dot(X, W1) + b1A1 = 1 / (1 + np.exp(-Z1))Z2 = np.dot(A1, W2) + b2A2 = 1 / (1 + np.exp(-Z2))return A2
    
    ?
    • 理解矩陣運算在神經層中的作用
    • 掌握激活函數的數學表達式

四、實踐建議

  1. 代碼規范

    • 使用input_shape明確指定輸入維度
    • 優先使用relu激活函數(除輸出層)
    • 保持層命名規范(如dense_1,?dense_2
  2. 常見錯誤處理

    • 維度不匹配:檢查輸入數據形狀與模型定義是否一致
    • 損失函數選擇錯誤:回歸問題用mse,多分類用categorical_crossentropy
    • 訓練停滯:嘗試調整學習率、增加訓練輪數或添加正則化
  3. 性能優化技巧

    • 使用 GPU 加速:tf.config.experimental.set_memory_growth
    • 批量歸一化:BatchNormalization
    • 早停機制:EarlyStopping回調

五、總結

Sequential API是構建簡單神經網絡的首選方法,使用時數據格式必須嚴格符合模型輸入要求,訓練流程通過compilefit方法標準化。注意學習時調用API的同時也要知道其原理,在調試或研究新算法時嘗試手動實現,通過單元測試確保數據預處理的正確性。

前向傳播的實現思路

上一篇筆記雖然寫了代碼,但是沒有詳細寫思路。這篇給出用純 Python 和 NumPy 手動實現神經網絡的前向傳播的具體思路。

一、簡介

  1. 底層原理理解

    • 大框架的神經網絡數學機制
    • 矩陣運算在神經元激活中的作用
    • 明確激活函數的計算邏輯
  2. 框架

    • 不依賴 TensorFlow/PyTorch 的實現方法
    • 為未來可能的框架創新提供思路
    • 強調理解底層對調試和算法創新的重要性
  3. 代碼實現規范

    • 使用 NumPy 進行矩陣運算
    • 采用標準化的參數命名和維度管理
    • 實現可擴展的網絡結構

二、技術細節解析

1.?前向傳播核心步驟
  • 輸入層到隱藏層

    z1 = np.dot(X, W1) + b1
    a1 = sigmoid(z1)
    
    ?
    • X: 輸入特征矩陣(形狀[樣本數, 輸入維度]
    • W1: 第一層權重矩陣(形狀[輸入維度, 隱藏單元數]
    • b1: 第一層偏置向量(形狀[隱藏單元數]
    • sigmoid函數:σ(z) = 1 / (1 + e^{-z})
  • 隱藏層到輸出層

    z2 = np.dot(a1, W2) + b2
    a2 = sigmoid(z2)
    
    ?
    • W2: 第二層權重矩陣(形狀[隱藏單元數, 輸出維度]
    • b2: 第二層偏置向量(形狀[輸出維度]
2.?參數初始化示例
W1 = np.array([[1, 2], [-3, 4], [5, -6]])  # 3×2矩陣
b1 = np.array([-1, 2, 3])                # 3維向量
W2 = np.array([[0.1], [-0.2], [0.3]])     # 3×1矩陣
b2 = np.array([0.4])                     # 1維向量
3.?咖啡烘焙模型實現
def sigmoid(z):return 1 / (1 + np.exp(-z))# 輸入特征(1樣本×2特征)
X = np.array([[200, 17]])# 前向傳播
z1 = np.dot(X, W1) + b1
a1 = sigmoid(z1)
z2 = np.dot(a1, W2) + b2
a2 = sigmoid(z2)  # 輸出預測值

三、手動實現的優勢與局限

優勢:
  1. 數學透明性

    • 清晰展示矩陣運算與神經元激活關系
    • 便于理解反向傳播梯度計算原理
  2. 調試便利性

    • 直接檢查中間變量值
    • 定位維度不匹配等問題
  3. 研究創新

    • 驗證新算法可行性
    • 探索非傳統網絡結構
局限:
  1. 性能問題

    • 純 Python 實現速度慢
    • 無法利用 GPU 加速
  2. 擴展性差

    • 手動實現多層網絡復雜度高
    • 難以支持卷積、循環等復雜層
  3. 維護成本

    • 需手動處理內存管理
    • 缺乏自動微分支持

四、實踐建議

  1. 代碼規范

    • 使用顯式維度標注:
      W1 = np.random.randn(input_dim, hidden_dim)  # 輸入維度×隱藏層維度
      
    • 保持參數命名一致性:
      weights = {'W1': W1, 'b1': b1, 'W2': W2, 'b2': b2}
      
  2. 常見錯誤處理

    • 維度不匹配
      # 錯誤示例:形狀[2,3]與[3,1]不匹配
      z = np.dot(a1, W2) + b2  # a1形狀[1,3], W2形狀[3,1] → 正確
      
    • 數值溢出
      # 防止sigmoid輸入過大導致數值不穩定
      z = np.clip(z, -500, 500)
      
  3. 性能優化技巧

    • 使用 NumPy 向量化運算替代循環
    • 預先分配內存空間:
      a1 = np.zeros((X.shape[0], hidden_dim))
      

五、與框架實現的對比

功能特性手動實現TensorFlow/Keras
矩陣運算NumPyTensorFlow 優化內核
自動微分需手動推導梯度公式自動生成梯度
設備支持僅 CPUCPU/GPU/TPU 自動選擇
模型保存需手動序列化參數內置save()/load_model()
分布式訓練需自行實現原生支持 Horovod 等分布式框架

六、總結

這段視頻通過咖啡烘焙模型的具體實現,展示了神經網絡前向傳播的底層機制。核心要點包括:

  1. 數學基礎:矩陣乘法、激活函數、線性組合
  2. 代碼實現:參數初始化、向量化運算、模塊化設計
  3. 實踐意義:理解框架原理、提升調試能力、探索新算法

筆者注

在學習階段還是手動實現一遍實現加深對原理理解,雖然不會寫框架但是理解底層對優化總是有好處。在實際項目中優先使用成熟框架。通過對比手動與框架實現理解性能差異,有興趣可以去拆框架代碼學習。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/900367.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/900367.shtml
英文地址,請注明出處:http://en.pswp.cn/news/900367.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

多元高斯分布函數

1、 n n n元向量 假設 n n n元隨機變量 X X X X [ X 1 , X 2 , ? , X i , ? , X n ] T μ [ μ 1 , μ 2 , ? , μ i , ? , μ n ] T σ [ σ 1 , σ 2 , ? , σ i , ? , σ n ] T X i ~ N ( μ i , σ i 2 ) \begin{split} X&[X_1,X_2,\cdots,X_i,\cdots ,X_n…

洞察 Linux 進程管理

一、進程和線程的概念 1.進程 (1)概念 進程是程序在操作系統中的一次執行過程,是系統進行資源分配和調度的基本單位。進程是程序的執行實例,擁有獨立的資源(如內存、文件描述符等)。每個進程在創建時會被…

PyTorch 實現圖像版多頭注意力(Multi-Head Attention)和自注意力(Self-Attention)

本文提供一個適用于圖像輸入的多頭注意力機制(Multi-Head Attention)PyTorch 實現,適用于 ViT、MAE 等視覺 Transformer 中的注意力計算。 模塊說明 輸入支持圖像格式 (B, C, H, W)內部轉換為序列 (B, N, C),其中 N H * W多頭注…

每日一題(小白)字符串娛樂篇16

分析題意可以了解到本題要求在一串字符串中找到所有組合起來排序遞增的字符串。我們可以默認所有字符在字符串中的上升序列是1,從第一個字符開始找,如果后面的字符大于前面的字符就說明這是一個上序列那么后面字符所在的數組加一,如果連接不上…

Ubuntu 22 Linux上部署DeepSeek R1保姆式操作詳解(Xinference方式)

一、安裝步驟 1.基礎環境安裝 安裝顯卡驅動、cuda,根據自己硬件情況查找相應編號,本篇不介紹這部分內容,只給出參考指令,詳情請讀者自行查閱互聯網其它參考資料。 sudo apt install nvidia-utils-565-server sudo apt install…

Immutable.js 完全指南:不可變數據的藝術與實踐

引言 在現代前端開發中,狀態管理是一個核心挑戰。隨著應用復雜度增加,如何高效、安全地管理應用狀態變得至關重要。Immutable.js 是 Facebook 推出的一個 JavaScript 庫,它提供了持久化不可變數據結構,可以幫助開發者更好地管理應…

字符串數據類型的基本運算

任務描述 本關任務:從后臺輸入任意三個字符串,求最大的字符串。 相關知識 字符串本身是存放在一塊連續的內存空間中,并以’\0’作為字符串的結束標記。 字符指針變量本身是一個變量,用于存放字符串的第 1 個字符的地址。 字符數…

Ubuntu 22.04 一鍵部署openManus

openManus 前言 OpenManus-RL,這是一個專注于基于強化學習(RL,例如 GRPO)的方法來優化大語言模型(LLM)智能體的開源項目,由來自UIUC 和 OpenManus 的研究人員合作開發。 前提要求 安裝deepseek docker方式安裝 ,windows 方式安裝,Linux安裝方式

PDF 轉圖片,一行代碼搞定!批量支持已上線!

大家好,我是程序員晚楓。今天我要給大家帶來一個超實用的功能——popdf 現在支持 PDF 轉圖片了,而且還能批量操作!是不是很激動?別急,我來手把手教你玩轉這個功能。 1. 一行代碼搞定單文件轉換 popdf 的核心就是簡單暴…

《比特城的機密郵件:加密、簽名與防篡改的守護之戰》

點擊下面圖片帶您領略全新的嵌入式學習路線 🔥爆款熱榜 88萬閱讀 1.6萬收藏 第一章:風暴前的密令 比特城的議會大廳內,首席長老艾德文握著一卷足有半人高的羊皮紙,眉頭緊鎖。紙上是即將頒布的《新紀元法典》——這份文件不僅內…

8.用戶管理專欄主頁面開發

用戶管理專欄主頁面開發 寫在前面用戶權限控制用戶列表接口設計主頁面開發前端account/Index.vuelangs/zh.jsstore.js 后端Paginator概述基本用法代碼示例屬性與方法 urls.pyviews.py 運行效果 總結 歡迎加入Gerapy二次開發教程專欄! 本專欄專為新手開發者精心策劃了…

http://noi.openjudge.cn/_2.5基本算法之搜索_1804:小游戲

文章目錄 題目深搜代碼寬搜代碼深搜數據演示圖總結 題目 1804:小游戲 總時間限制: 1000ms 內存限制: 65536kB 描述 一天早上,你起床的時候想:“我編程序這么牛,為什么不能靠這個賺點小錢呢?”因此你決定編寫一個小游戲。 游戲在一…

發生梯度消失, 梯度爆炸問題的原因,怎么解決?

目錄 一、梯度消失的原因 二、梯度爆炸的原因 三、共同的結構性原因 四、解決辦法 五、補充知識 一、梯度消失的原因 梯度消失指的是在反向傳播過程中,梯度隨著層數的增加指數級減小(趨近于0),導致淺層網絡的權重幾乎無法更新…

【USRP】srsRAN 開源 4G 軟件無線電套件

srsRAN 是SRS開發的開源 4G 軟件無線電套件。 srsRAN套件包括: srsUE - 具有原型 5G 功能的全棧 SDR 4G UE 應用程序srsENB - 全棧 SDR 4G eNodeB 應用程序srsEPC——具有 MME、HSS 和 S/P-GW 的輕量級 4G 核心網絡實現 安裝系統 Ubuntu 20.04 USRP B210 sudo …

ChatGPT 4:解鎖AI文案、繪畫與視頻創作新紀元

文章目錄 一、ChatGPT 4的技術革新二、AI文案創作:精準生成與個性化定制三、AI繪畫藝術:從文字到圖像的神奇轉化四、AI視頻制作:自動化剪輯與創意實現五、知識庫與ChatGPT 4的深度融合六、全新的變革和機遇《ChatGPT 4 應用詳解:A…

在js中數組相關用法講解

數組 uniqueArray 簡單數組去重 /*** 簡單數組去重* param arr* returns*/ export const uniqueArray <T>(arr: T[]) > [...new Set(arr)];const arr1 [1,1,1,1 2, 3];uniqueArray(arr); // [1,2,3]uniqueArrayByKey 根據 key 數組去重 /*** 根據key數組去重* …

RT-Thread ulog 日志組件深度分析

一、ulog 組件核心功能解析 輕量化與實時性 ? 資源占用&#xff1a;ulog 核心代碼僅需 ROM<1KB&#xff0c;RAM<0.2KB&#xff0c;支持在資源受限的MCU&#xff08;如STM32F103&#xff09;中運行。 ? 異步/同步模式&#xff1a;默認采用異步環形緩沖區&#xff08;rt_…

T113s3遠程部署Qt應用(dropbear)

T113-S3 是一款先進的應用處理器&#xff0c;專為汽車和工業控制市場而設計。 它集成了雙核CortexTM-A7 CPU和單核HiFi4 DSP&#xff0c;提供高效的計算能力。 T113-S3 支持 H.265、H.264、MPEG-1/2/4、JPEG、VC1 等全格式解碼。 獨立的硬件編碼器可以編碼為 JPEG 或 MJPEG。 集…

12.青龍面板自動化我的生活

安裝 docker方式 docker run -dit \ -v /root/ql:/ql/data \ -p 5700:5700 \ -e ENABLE_HANGUPtrue \ -e ENABLE_WEB_PANELtrue \ --name qinglong \ --hostname qinglong \ --restart always \ whyour/qinglongk8s方式 https://truecharts.org/charts/stable/qinglong/ he…

Maven 遠程倉庫推送方法

步驟 1&#xff1a;配置 pom.xml 中的遠程倉庫地址 在項目的 pom.xml 文件中添加 distributionManagement 配置&#xff0c;指定遠程倉庫的 URL。 xml 復制 <project>...<distributionManagement><!-- 快照版本倉庫 --><snapshotRepository><id…