深度學習雙雄對決:PyTorch vs TensorFlow 自定義層大比拼
目錄
- `深度學習雙雄對決:PyTorch vs TensorFlow 自定義層大比拼`
- 一、TensorFlow 實現 DNN
- 1. 核心邏輯
- 二、PyTorch 實現自定義層
- 1. 核心邏輯
- 三、關鍵差異對比
- 四、總結
一、TensorFlow 實現 DNN
1. 核心邏輯
- 直接繼承
tf.keras.layers.Layer
:無需中間類,直接在build
中定義多層結構。 - 動態參數管理:通過
add_weight
注冊每一層的權重和偏置。
import tensorflow as tfclass CustomDNNLayer(tf.keras.layers.Layer):def __init__(self, hidden_units, output_dim, **kwargs):super(CustomDNNLayer, self).__init__(**kwargs)self.hidden_units = hidden_unitsself.output_dim = output_dimdef build(self, input_shape):# 輸入層到第一個隱藏層self.w1 = self.add_weight(name='w1', shape=(input_shape[-1], self.hidden_units[0]),initializer='random_normal',trainable=True)self.b1 = self.add_weight(name='b1',shape=(self.hidden_units[0],),initializer='zeros',trainable=True)# 隱藏層之間self.ws = []self.bs = []for i in range(len(self.hidden_units) - 1):self.ws.append(self.add_weight(name=f'w{i+2}', shape=(self.hidden_units[i], self.hidden_units[i+1]),initializer='random_normal',trainable=True))self.bs.append(self.add_weight(name=f'b{i+2}',shape=(self.hidden_units[i+1],),initializer='zeros',trainable=True))# 輸出層self.wo = self.add_weight(name='wo',shape=(self.hidden_units[-1], self.output_dim),initializer='random_normal',trainable=True)self.bo = self.add_weight(name='bo',shape=(self.output_dim,),initializer='zeros',trainable=True)def call(self, inputs):x = tf.matmul(inputs, self.w1) + self.b1x = tf.nn.relu(x)for i in range(len(self.hidden_units) - 1):x = tf.matmul(x, self.ws[i]) + self.bs[i]x = tf.nn.relu(x)x = tf.matmul(x, self.wo) + self.boreturn x
二、PyTorch 實現自定義層
1. 核心邏輯
- 繼承
nn.Module
:自定義層本質是模塊的組合。 - 使用
nn.ModuleList
:動態管理多個nn.Linear
層。
import torch
import torch.nn as nnclass CustomPyTorchDNN(nn.Module):def __init__(self, input_size, hidden_sizes, output_size):super(CustomPyTorchDNN, self).__init__()self.hidden_layers = nn.ModuleList()prev_size = input_size# 動態添加隱藏層for hidden_size in hidden_sizes:self.hidden_layers.append(nn.Linear(prev_size, hidden_size))prev_size = hidden_size# 輸出層self.output_layer = nn.Linear(prev_size, output_size)def forward(self, x):for layer in self.hidden_layers:x = torch.relu(layer(x))x = self.output_layer(x)return x
三、關鍵差異對比
維度 | TensorFlow 實現 | PyTorch 實現 |
---|---|---|
類繼承方式 | 直接繼承 tf.keras.layers.Layer ,無中間類。 | 繼承 nn.Module ,通過 nn.ModuleList 管理子模塊。 |
參數管理 | 在 build 中顯式注冊每層權重(add_weight )。 | 自動注冊所有 nn.Linear 參數(無需手動操作)。 |
前向傳播定義 | 通過 call 方法逐層計算,需手動處理每層的權重和激活函數。 | 通過 forward 方法逐層調用 nn.Linear ,激活函數手動插入。 |
靈活性 | 更底層,適合完全自定義邏輯(如非線性變換、特殊參數初始化)。 | 更簡潔,適合快速構建標準網絡結構。 |
訓練流程 | 需手動實現訓練循環(反向傳播 + 優化器)。 | 需手動實現訓練循環(與 TensorFlow 類似)。 |
四、總結
- TensorFlow:通過直接繼承
tf.keras.layers.Layer
,可實現完全自定義的 DNN,但需手動管理多層權重和激活邏輯,適合對模型細節有嚴格控制需求的場景。 - PyTorch:通過直接繼承
nn.Module
,可實現完全自定義的 DNN;利用nn.ModuleList
和nn.Linear
的組合,能高效構建標準 DNN 結構,代碼簡潔且易于擴展,適合快速原型開發和研究場景。
兩種實現均滿足用戶對“直接繼承核心類 + 使用基礎組件”的要求,可根據具體任務選擇框架。