學習目标:
損失函數
損失函數的輸入是一個輸入的pair: (output, target), 然後計算出一個數值來評估output和target之間的差距大小.
在torch.nn中有若幹不同的損失函數可供使用, 比如nn.MSELoss就是通過計算均方差損失來評估輸入和目标值之間的差距.
反向傳播(backpropagation)
在Pytorch中執行反向傳播非常簡便, 全部的操作就是loss.backward().
在執行反向傳播之前, 要先将梯度清零, 否則梯度會在不同的批次資料之間被累加。
更新網絡參數 torch.optim
學習内容:
損失函數
1、應用nn.MSELoss計算損失的一個例子,承上
input = torch.randn(1, 1, 32, 32)
output = net(input)
# 1行10列的一維向量
target = torch.randn(10)
# 改變target的形狀為二維張量, 為了和output比對
target = target.view(1, -1)
criterion = nn.MSELoss()
loss = criterion(output, target) # 成對出現
print('loss', loss)
target:
tensor([ 0.1960, 0.4792, -0.2190, 0.0378, -2.2306, 0.8693, 0.3163, -0.8885,
-0.4302, -2.1175])
2、 關于方向傳播的鍊條
如果我們跟蹤loss反向傳播的方向, 使用.grad_fn屬性列印, 将可以看到一張完整的計算圖如下:
input -> conv2d -> relu -> maxpool2d -> conv2d -> relu -> maxpool2d
-> view -> linear -> relu -> linear -> relu -> linear
-> MSELoss
-> loss
當調用loss.backward()時, 整張計算圖将對loss進行自動求導, 所有屬性
requires_grad=True的Tensors都将參與梯度求導的運算, 并将梯度累加到
Tensors中的.grad屬性中.
print(loss.grad_fn) # MSELoss 他的上一層如下
print(loss.grad_fn.next_functions[0][0]) # Linear 他的上一層如下
print(loss.grad_fn.next_functions[0][0].next_functions[0][0]) # ReLU
<MseLossBackward object at 0x000001F7E0A54788> #
<AddmmBackward object at 0x000001F7DCE9EA08> # 全連接配接線性層
<AccumulateGrad object at 0x000001F7E0A54788> # relu
3、 掌握條件語句
4、 掌握循環語句
反向傳播☆
# 先将梯度清零
net.zero_grad()
print('conv1.bias.grad before backward')
# 未對梯度grad進行指派,未求導,0
print(net.conv1.bias.grad)
# Pytorch中執行一次反向傳播的代碼,更新grad中的值
loss.backward()
print('conv1.bias.grad after backward')
print(net.conv1.bias.grad)
conv1.bias.grad before backward
None
conv1.bias.grad after backward
tensor([-0.0019, -0.0098, 0.0037, 0.0020, 0.0046, 0.0019])
更新網絡參數 torch.optim
- 更新參數最簡單的算法就是SGD(随機梯度下降).
-
具體的算法公式表達式為:
weight = weight - learning_rate * gradient
傳統的Python代碼來實作SGD
learning_rate = 0.01
for f in net.parameters():
f.data.sub_(f.grad.data * learning_rate)
使用Pytorch官方推薦的标準代碼
# 首先導入優化器的包, optim中包含若幹常用的優化算法, 比如SGD, Adam等
import torch.optim as optim
# 通過optim建立優化器對象,學習率0.01
optimizer = optim.SGD(net.parameters(), lr=0.01)
# 将優化器執行梯度清零的操作
optimizer.zero_grad()
output = net(input)
loss = criterion(output, target)
# 對損失值執行反向傳播的操作,即計算python 的 f.grad
loss.backward()
# 參數的更新通過一行标準代碼來執行
optimizer.step() # ==f.data.sub_(f.grad.data * learning_rate)
必備代碼:
optimizer.zero_grad()
loss.backward()
optimizer.step()
學習時間:
抽出來的時間。
學習産出:
