天天看點

Pytorch_6 損失函數、反向傳播、torch.optim學習目标:學習内容:學習時間:學習産出:

學習目标:

損失函數

損失函數的輸入是一個輸入的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()

學習時間:

抽出來的時間。

學習産出:

Pytorch_6 損失函數、反向傳播、torch.optim學習目标:學習内容:學習時間:學習産出:
Pytorch_6 損失函數、反向傳播、torch.optim學習目标:學習内容:學習時間:學習産出:
Pytorch_6 損失函數、反向傳播、torch.optim學習目标:學習内容:學習時間:學習産出: