動學學深度學習pytorch
參考地址:https://zh.d2l.ai/
文章目錄
- 動學學深度學習pytorch
- 1-第05章-深度學習計算
- 1. 層(Layer)與塊(Block)
- 1.1 什么是深度學習中的“層”?
- 1.2 什么是“塊”(Block)?
- 1.3 PyTorch 中如何定義自定義塊?
- 2. Sequential 與自定義順序塊
- 2.1 `nn.Sequential` 的作用
- 2.2 如何手寫簡化版 `MySequential`?
- 3. 參數管理
- 3.1 如何訪問模型任意層的參數?
- 3.2 如何初始化參數?
- 3.3 什么是參數綁定(共享)?
- 4. 延后初始化(Deferred Initialization)
- 4.1 什么是延后初始化?
- 5. 自定義層
- 5.1 如何創建不帶參數的層?
- 5.2 如何創建帶參數的層?
- 6. 模型讀寫
- 6.1 如何保存與加載模型參數?
- 6.2 如何保存/加載完整張量或張量字典?
- 7. GPU 計算
- 7.1 如何查看可用 GPU?
- 7.2 如何將張量與模型移至 GPU?
- 7.3 跨 GPU 注意事項
1-第05章-深度學習計算
1. 層(Layer)與塊(Block)
1.1 什么是深度學習中的“層”?
層是神經網絡的基本計算單元,接收輸入、生成輸出,并由一組可學習參數(權重、偏置)描述。
1.2 什么是“塊”(Block)?
塊是比層更大、可遞歸組合的抽象單元,可以表示:
- 單個層
- 多個層組成的組件
- 整個模型本身
塊通過類(class)實現,必須實現: forward()
:前向傳播- 參數存儲與初始化
- 反向傳播由框架自動完成。
1.3 PyTorch 中如何定義自定義塊?
示例:實現一個 20→256→10 的 MLP 塊
class MLP(nn.Module):def __init__(self):super().__init__()self.hidden = nn.Linear(20, 256)self.out = nn.Linear(256, 10)def forward(self, X):return self.out(F.relu(self.hidden(X)))
2. Sequential 與自定義順序塊
2.1 nn.Sequential
的作用
按順序串聯子模塊,自動將上一層的輸出作為下一層輸入。
net = nn.Sequential(nn.Linear(20, 256),nn.ReLU(),nn.Linear(256, 10)
)
2.2 如何手寫簡化版 MySequential
?
class MySequential(nn.Module):def __init__(self, *args):super().__init__()for idx, module in enumerate(args):self._modules[str(idx)] = moduledef forward(self, X):for block in self._modules.values():X = block(X)return X
3. 參數管理
3.1 如何訪問模型任意層的參數?
- 索引方式
net[2].weight # 第3層權重
net[2].bias.data # 第3層偏置值
- 一次性遍歷
for name, param in net.named_parameters():print(name, param.shape)
3.2 如何初始化參數?
- 內置初始化器
nn.init.normal_(net[0].weight, mean=0, std=0.01)
nn.init.constant_(net[0].bias, 0)
- 自定義初始化
def my_init(m):if type(m) == nn.Linear:with torch.no_grad():m.weight.uniform_(-10, 10)m.weight *= m.weight.abs() >= 5
net.apply(my_init)
3.3 什么是參數綁定(共享)?
多個層使用同一 Parameter
對象,修改一處即全部同步。
shared = nn.Linear(8, 8)
net = nn.Sequential(nn.Linear(4, 8), nn.ReLU(),shared, nn.ReLU(),shared, nn.ReLU(),nn.Linear(8, 1)
)
4. 延后初始化(Deferred Initialization)
4.1 什么是延后初始化?
框架直到第一次前向傳播時才根據輸入張量推斷各層權重形狀,無需手動指定輸入維度。
net = nn.Sequential(nn.LazyLinear(256), nn.ReLU(), nn.LazyLinear(10))
net(torch.randn(2, 20)) # 觸發初始化
5. 自定義層
5.1 如何創建不帶參數的層?
示例:將輸入減去均值
class CenteredLayer(nn.Module):def forward(self, X):return X - X.mean()
5.2 如何創建帶參數的層?
示例:自定義全連接層
class MyLinear(nn.Module):def __init__(self, in_units, units):super().__init__()self.weight = nn.Parameter(torch.randn(in_units, units))self.bias = nn.Parameter(torch.randn(units))def forward(self, X):return torch.matmul(X, self.weight) + self.bias
6. 模型讀寫
6.1 如何保存與加載模型參數?
- 保存
torch.save(net.state_dict(), 'mlp.params')
- 加載
clone = MLP()
clone.load_state_dict(torch.load('mlp.params'))
6.2 如何保存/加載完整張量或張量字典?
torch.save({'x': x, 'y': y}, 'tensor_dict.pt')
data = torch.load('tensor_dict.pt')
7. GPU 計算
7.1 如何查看可用 GPU?
torch.cuda.device_count() # GPU 數量
torch.device('cuda:0') # 第0塊 GPU
7.2 如何將張量與模型移至 GPU?
- 張量
X = torch.ones(2, 3, device='cuda:0')
- 模型
net = nn.Sequential(nn.Linear(3, 1))
net.to('cuda:0')
7.3 跨 GPU 注意事項
- 必須保證參與運算的數據在同一設備上
X_on1 = X.cuda(1) # 復制到 GPU1
Y_on1 = Y.cuda(1)
Z = X_on1 + Y_on1
- 減少 CPU?GPU 拷貝次數以避免性能瓶頸