Python Pytorch深度學習之神經(jīng)網(wǎng)絡
一、簡介
神經(jīng)網(wǎng)絡可以通過torch.nn包構建,上一節(jié)已經(jīng)對自動梯度有些了解,神經(jīng)網(wǎng)絡是基于自動梯度來定義一些模型。一個nn.Module包括層和一個方法,它會返回輸出。例如:數(shù)字圖片識別的網(wǎng)絡:
上圖是一個簡單的前回饋神經(jīng)網(wǎng)絡,它接收輸入,讓輸入一個接著一個通過一些層,最后給出輸出。
二、神經(jīng)網(wǎng)絡訓練過程
一個典型的神經(jīng)
# -*- coding: utf-8 -*- """ Created on Sun Oct 24 15:56:23 2021 @author: Lenovo """ # 神經(jīng)網(wǎng)絡 # import torch import torch.nn as nn import torch.nn.functional as F class Net(nn.Module): def __init__(self): super(Net,self).__init__() # 1個輸入,6個輸出,5*5的卷積 # 內(nèi)核 self.conv1=nn.Conv2d(1,6,5) self.conv2=nn.Conv2d(6,16,5) # 映射函數(shù):線性——y=Wx+b self.fc1=nn.Linear(16*5*5,120)#輸入特征值:16*5*5,輸出特征值:120 self.fc2=nn.Linear(120,84) self.fc3=nn.Linear(84,10) def forward(self,x): x=F.max_pool2d(F.relu(self.conv1(x)),(2,2)) # 如果其尺寸是一個square只能指定一個數(shù)字 x=F.max_pool2d(F.relu(self.conv2(x)),2) x=x.view(-1,self.num_flat_features(x)) x=F.relu(self.fc1(x)) x=F.relu(self.fc2(x)) x=self.fc3(x) return x def num_flat_features(self,x): size=x.size()[1:] num_features=1 for s in size: num_features *= s return num_features net=Net() print(net)
運行結果
以上定義了一個前饋函數(shù),然后反向傳播函數(shù)被自動通過autograd定義,可以使用任何張量操作在前饋函數(shù)上。
2、通過調(diào)用net.parameters()返回模型可訓練的參數(shù)
# 查看模型可訓練的參數(shù) params=list(net.parameters()) print(len(params)) print(params[0].size())# conv1 的權重weight
運行結果
3、迭代整個輸入
嘗試隨機生成一個3232的輸入。注:期望的輸入維度是3232,為了在MNIST數(shù)據(jù)集上使用這個網(wǎng)絡,我們需要把數(shù)據(jù)集中的圖片維度修改為32*32
input=torch.randn(1, 1, 32,32) print(input) out=net(input) print(out)
運行結果
4、調(diào)用反向傳播
將所有參數(shù)梯度緩存器置零,用隨機的梯度來反向傳播
# 調(diào)用反向傳播 net.zero_grad() out.backward(torch.randn(1, 10))
運行結果
5、計算損失值
#計算損失值——損失函數(shù):一個損失函數(shù)需要一對輸入:模型輸出和目標,然后計算一個值來評估輸出距離目標多遠。有一些不同的損失函數(shù)在nn包中,一個簡單的損失函數(shù)就是nn.MSELoss,他計算了均方誤差
如果跟隨損失到反向傳播路徑,可以使用他的.grad_fn屬性,將會看到一個計算圖
# 在調(diào)用loss.backward()時候,整個圖都會微分,而且所有的圖中的requires_grad=True的張量將會讓他們的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
運行結果
6、反向傳播梯度
為了實現(xiàn)反向傳播loss,我們所有需要做的事情僅僅是使用loss.backward()。需要先清空現(xiàn)存的梯度,不然梯度將會和現(xiàn)存的梯度累計在一起。
# 調(diào)用loss.backward()然后看一下con1的偏置項在反向傳播之前和之后的變化 net.zero_grad() print('conv1.bias.grad before backward') print(net.conv1.bias.grad) loss.backward()#反向傳播 print('conv1.bias.grad after backward') print(net.conv1.bias.grad)
運行結果
7、更新神經(jīng)網(wǎng)絡參數(shù)
# ============================================================================= # # 最簡單的更新規(guī)則就是隨機梯度下降:weight=weight-learning_rate*gradient # learning_rate=0.01 # for f in net.parameters(): # f.data.sub_(f.grad.data*learning_rate)#f.data=f.data-learning_rate*gradient # =============================================================================
如果使用的是神經(jīng)網(wǎng)絡,想要使用不同的更新規(guī)則,類似于SGD,Nesterov-SGD,Adam,RMSProp等。為了讓這可行,Pytorch建立一個稱為torch.optim的package實現(xiàn)所有的方法,使用起來更加方便
# ============================================================================= # import torch.optim as optim # optimizer=optim.SGD(net.parameters(), lr=0.01) # # 在迭代訓練過程中 # optimizer.zero_grad()#將現(xiàn)存梯度置零 # output=net(input) # loss=criterion(output,target) # loss.backward()#反向傳遞 # optimizer.step()#更新網(wǎng)絡參數(shù) # =============================================================================
總結
本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關注腳本之家的更多內(nèi)容!
相關文章
詳解numpy矩陣的創(chuàng)建與數(shù)據(jù)類型
這篇文章主要介紹了詳解numpy矩陣的創(chuàng)建與數(shù)據(jù)類型,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2019-10-10Python使用smtp和pop簡單收發(fā)郵件完整實例
這篇文章主要介紹了Python使用smtp和pop簡單收發(fā)郵件完整實例,簡單介紹了smtp和pop,然后分享了相關實例代碼,具有一定借鑒價值,需要的朋友可以參考下2018-01-01Python socket.error: [Errno 98] Address already in use的原因和解決
這篇文章主要介紹了Python socket.error: [Errno 98] Address already in use的原因和解決方法,在Python的socket編程中可能會經(jīng)常遇到這個問題,需要的朋友可以參考下2014-08-08Python讀取postgresql數(shù)據(jù)庫詳情
這篇文章主要介紹了Python讀取postgresql數(shù)據(jù)庫詳情,文章圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下2022-09-09python第三方庫subprocess執(zhí)行cmd同時輸入密碼獲取參數(shù)
本文給大家介紹python subprocess執(zhí)行cmd同時輸入密碼獲取參數(shù),手動輸入cmd命令,本文給大家逐一介紹這個命令的使用方法,感興趣的朋友跟隨小編一起看看吧2024-01-01