簡易神經網路

2022-08-17 16:54:17 字數 4402 閱讀 3907

torch.autogard包的主要功能是完成神經網路後向傳播中的鏈式求導。

實現自動梯度功能的過程大致為:先通過輸入的tensor資料型別的變數在神經網路的前向傳播過程中生成一張計算圖,然後根據這個計算圖和輸出結果準確計算出每個引數需要更新的梯度,並通過完成後向傳播完成對引數的梯度更新。

variable類對變數型別進行封裝,計算圖中的各個節點就是乙個variable物件,這樣才能自動梯度的功能。

x.data是tensor資料型別的變數,x.grad是乙個variable物件,表示的是x的梯度,訪問梯度值時使用x.grad.data

variable中的requires_grad的值是false,那麼表示該變數在進行 自動梯度計算的過程中不會保留梯度值。

**中的loss.backward()函式功能是讓模型根據計算圖自動計算每個節點的梯度值並根據需求進行保留。

import torch

from 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.0000

epoch: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 torch

import 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.0002

epoch: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 表示是由亮向暗過渡,下面這個圖左邊暗...