torch.autogard包的主要功能是完成神經網路後向傳播中的鏈式求導。
實現自動梯度功能的過程大致為:先通過輸入的tensor資料型別的變數在神經網路的前向傳播過程中生成一張計算圖,然後根據這個計算圖和輸出結果準確計算出每個引數需要更新的梯度,並通過完成後向傳播完成對引數的梯度更新。
variable類對變數型別進行封裝,計算圖中的各個節點就是乙個variable物件,這樣才能自動梯度的功能。
x.data是tensor資料型別的變數,x.grad是乙個variable物件,表示的是x的梯度,訪問梯度值時使用x.grad.data
variable中的requires_grad的值是false,那麼表示該變數在進行 自動梯度計算的過程中不會保留梯度值。
**中的loss.backward()函式功能是讓模型根據計算圖自動計算每個節點的梯度值並根據需求進行保留。
import torchfrom torch.autograd import variable
batch_n=100
hidden_layer=100
input_data=1000
output_data=10
x=variable(torch.randn(batch_n,input_data),requires_grad=false)
y=variable(torch.randn(batch_n,output_data),requires_grad=false)
w1=variable(torch.randn(input_data,hidden_layer),requires_grad=true)
w2=variable(torch.randn(hidden_layer,output_data),requires_grad=true)
epoch_n=20
learning_rate=1e-6
for epoch in range(epoch_n):
y_pred=x.mm(w1).clamp(min=0).mm(w2)
loss=(y_pred-y).pow(2).sum()
print("epoch:{},loss:".format(epoch,loss.item()))
loss.backward()
w1.data-=learning_rate*w1.grad.data
w2.data-=learning_rate*w2.grad.data
w1.grad.data.zero_()
w2.grad.data.zero_()
執行結果:
epoch:0,loss:42224004.0000epoch:1,loss:77058104.0000
epoch:2,loss:308114176.0000
epoch:3,loss:817516032.0000
epoch:4,loss:156063712.0000
epoch:5,loss:25557000.0000
epoch:6,loss:14585559.0000
epoch:7,loss:9787973.0000
epoch:8,loss:7119412.0000
epoch:9,loss:5440572.0000
epoch:10,loss:4302151.0000
epoch:11,loss:3491998.2500
epoch:12,loss:2891954.7500
epoch:13,loss:2434416.7500
epoch:14,loss:2077421.0000
epoch:15,loss:1793414.0000
epoch:16,loss:1564289.0000
epoch:17,loss:1376933.2500
epoch:18,loss:1221765.5000
epoch:19,loss:1092128.5000
模型搭建和引數優化
torch.nn.sequential類是torch.nn中的一種 序列容器,通過在容器中巢狀各種實現神經網路中具體功能相關的類, 來完成對神經網路模型的搭建,最主要的是,引數會按照我們定義好的 序列自動傳遞下去。
下面**中
optimzer.zero_grad來完成對模型引數 梯度的歸零。
optimzer.step,它的主要功能是 使用計算得到的梯度值對各個節點的引數進行梯度更新。
import torchimport torch.nn as nn
import torch.optim as optim
from torch.autograd import variable
batch_n=64
hidden_layer=100
input_data=1000
output_data=10
models=nn.sequential(
nn.linear(input_data,hidden_layer),
nn.relu(),
nn.linear(hidden_layer,output_data)
)x=variable(torch.randn(batch_n,input_data),requires_grad=false)
y=variable(torch.randn(batch_n,output_data),requires_grad=false)
w1=variable(torch.randn(input_data,hidden_layer),requires_grad=true)
w2=variable(torch.randn(hidden_layer,output_data),requires_grad=true)
epoch_n=1000
learning_rate=1e-4
loss_fn=nn.mseloss()
optimzer=optim.adam(models.parameters(),lr=learning_rate)
for epoch in range(epoch_n):
y_pred=models(x)
loss=loss_fn(y_pred,y)
print("epoch:{},loss:".format(epoch,loss.item()))
optimzer.zero_grad()
loss.backward()
optimzer.step()
執行結果:
epoch:255,loss:0.0002epoch:256,loss:0.0002
epoch:257,loss:0.0002
epoch:258,loss:0.0002
epoch:259,loss:0.0001
epoch:260,loss:0.0001
epoch:261,loss:0.0001
epoch:262,loss:0.0001
epoch:263,loss:0.0001
epoch:264,loss:0.0001
epoch:265,loss:0.0001
epoch:266,loss:0.0001
epoch:267,loss:0.0001
epoch:268,loss:0.0001
epoch:269,loss:0.0001
epoch:270,loss:0.0001
epoch:271,loss:0.0001
epoch:272,loss:0.0001
epoch:273,loss:0.0001
epoch:274,loss:0.0001
epoch:275,loss:0.0001
epoch:276,loss:0.0001
epoch:277,loss:0.0001
epoch:278,loss:0.0001
epoch:279,loss:0.0001
epoch:280,loss:0.0000
epoch:281,loss:0.0000
epoch:282,loss:0.0000
epoch:283,loss:0.0000
epoch:284,loss:0.0000
torch.nn中包含的損失函式:
torch.nn.mseloss:torch.nn.mseloss類使用均方誤差函式對 損失值進行計算
torch.nn.l1loss:torch.nn.l1loss類使用平均絕對誤差函式對 損失值進行計算
torch.nn.crossentropyloss:torch.nn.crossentropyloss類用 於計算交叉熵
優化函式,torch.optim中包含很多可實現引數自動優化的類,如sgd、rmsprop、adagrad、adam等。
神經網路簡易教程
作者 renu khandelwal 編譯 vk medium 在這篇文章中,我們將了解神經網路的基礎知識。這個部落格的先決條件是對機器學習的基本理解,如果你嘗試過一些機器學習演算法,那就更好了。首先簡單介紹一下人工神經網路,也叫ann。很多機器學習演算法的靈感來自大自然,而最大的靈感來自我們的大腦...
神經網路 卷積神經網路
這篇卷積神經網路是前面介紹的多層神經網路的進一步深入,它將深度學習的思想引入到了神經網路當中,通過卷積運算來由淺入深的提取影象的不同層次的特徵,而利用神經網路的訓練過程讓整個網路自動調節卷積核的引數,從而無監督的產生了最適合的分類特徵。這個概括可能有點抽象,我盡量在下面描述細緻一些,但如果要更深入了...
神經網路 卷積神經網路
1.卷積神經網路概覽 來自吳恩達課上一張,通過對應位置相乘求和,我們從左邊矩陣得到了右邊矩陣,邊緣是白色寬條,當畫素大一些時候,邊緣就會變細。觀察卷積核,左邊一列權重高,右邊一列權重低。輸入,左邊的部分明亮,右邊的部分灰暗。這個學到的邊緣是權重大的寬條 都是30 表示是由亮向暗過渡,下面這個圖左邊暗...