PyTorch如何搭建一個簡單的網(wǎng)絡(luò)
1 任務(wù)
首先說下我們要搭建的網(wǎng)絡(luò)要完成的學習任務(wù): 讓我們的神經(jīng)網(wǎng)絡(luò)學會邏輯異或運算,異或運算也就是俗稱的“相同取0,不同取1” 。再把我們的需求說的簡單一點,也就是我們需要搭建這樣一個神經(jīng)網(wǎng)絡(luò),讓我們在輸入(1,1)時輸出0,輸入(1,0)時輸出1(相同取0,不同取1),以此類推。
2 實現(xiàn)思路
因為我們的需求需要有兩個輸入,一個輸出,所以我們需要在輸入層設(shè)置兩個輸入節(jié)點,輸出層設(shè)置一個輸出節(jié)點。因為問題比較簡單,所以隱含層我們只需要設(shè)置10個節(jié)點就可以達到不錯的效果了,隱含層的激活函數(shù)我們采用ReLU函數(shù),輸出層我們用Sigmoid函數(shù),讓輸出保持在0到1的一個范圍,如果輸出大于0.5,即可讓輸出結(jié)果為1,小于0.5,讓輸出結(jié)果為0.
3 實現(xiàn)過程
我們使用的簡單的快速搭建法。
3.1 引入必要庫
import torch import torch.nn as nn import numpy as np
用pytorch當然要引入torch包,然后為了寫代碼方便將torch包里的nn用nn來代替,nn這個包就是neural network的縮寫,專門用來搭神經(jīng)網(wǎng)絡(luò)的一個包。引入numpy是為了創(chuàng)建矩陣作為輸入。
3.2 創(chuàng)建訓練集
# 構(gòu)建輸入集 x = np.mat('0 0;' '0 1;' '1 0;' '1 1') x = torch.tensor(x).float() y = np.mat('1;' '0;' '0;' '1') y = torch.tensor(y).float()
我個人比較喜歡用np.mat這種方式構(gòu)建矩陣,感覺寫法比較簡單,當然你也可以用其他的方法。但是構(gòu)建完矩陣一定要有這一步 torch.tensor(x).float() ,必須要把你所創(chuàng)建的輸入轉(zhuǎn)換成tensor變量。
什么是tensor呢?你可以簡單地理解他就是pytorch中用的一種變量,你想用pytorch這個框架就必須先把你的變量轉(zhuǎn)換成tensor變量。而我們這個神經(jīng)網(wǎng)絡(luò)會要求你的輸入和輸出必須是float浮點型的,指的是tensor變量中的浮點型,而你用np.mat創(chuàng)建的輸入是int型的,轉(zhuǎn)換成tensor也會自動地轉(zhuǎn)換成tensor的int型,所以要在后面加個.float()轉(zhuǎn)換成浮點型。
這樣我們就構(gòu)建完成了輸入和輸出(分別是x矩陣和y矩陣),x是四行二列的一個矩陣,他的每一行是一個輸入,一次輸入兩個值,這里我們把所有的輸入情況都列了出來。輸出y是一個四行一列的矩陣,每一行都是一個輸出,對應(yīng)x矩陣每一行的輸入。
3.3 搭建網(wǎng)絡(luò)
myNet = nn.Sequential( nn.Linear(2,10), nn.ReLU(), nn.Linear(10,1), nn.Sigmoid() ) print(myNet)
輸出結(jié)果:
我們使用nn包中的Sequential搭建網(wǎng)絡(luò),這個函數(shù)就是那個可以讓我們像搭積木一樣搭神經(jīng)網(wǎng)絡(luò)的一個東西。
nn.Linear(2,10)的意思搭建輸入層,里面的2代表輸入節(jié)點個數(shù),10代表輸出節(jié)點個數(shù)。Linear也就是英文的線性,意思也就是這層不包括任何其它的激活函數(shù),你輸入了啥他就給你輸出了啥。nn.ReLU()這個就代表把一個激活函數(shù)層,把你剛才的輸入扔到了ReLU函數(shù)中去。 接著又來了一個Linear,最后再扔到Sigmoid函數(shù)中去。 2,10,1就分別代表了三個層的個數(shù),簡單明了。
3.4 設(shè)置優(yōu)化器
optimzer = torch.optim.SGD(myNet.parameters(),lr=0.05) loss_func = nn.MSELoss()
對這一步的理解就是,你需要有一個優(yōu)化的方法來訓練你的網(wǎng)絡(luò),所以這步設(shè)置了我們所要采用的優(yōu)化方法。
torch.optim.SGD的意思就是采用SGD(隨機梯度下降)方法訓練,你只需要把你網(wǎng)絡(luò)的參數(shù)和學習率傳進去就可以了,分別是 myNet.paramets 和 lr 。 loss_func 這句設(shè)置了代價函數(shù),因為我們的這個問題比較簡單,所以采用了MSE,也就是均方誤差代價函數(shù)。
3.5 訓練網(wǎng)絡(luò)
for epoch in range(5000): out = myNet(x) loss = loss_func(out,y) optimzer.zero_grad() loss.backward() optimzer.step()
我這里設(shè)置了一個5000次的循環(huán)(可能不需要這么多次),讓這個訓練的動作迭代5000次。每一次的輸出直接用myNet(x),把輸入扔進你的網(wǎng)絡(luò)就得到了輸出out(就是這么簡單粗暴?。?,然后用代價函數(shù)和你的標準輸出y求誤差。 清除梯度的那一步是為了每一次重新迭代時清除上一次所求出的梯度,你就把這一步記住就行,初學不用理解太深。 loss.backward() 當然就是讓誤差反向傳播,接著 optimzer.step() 也就是讓我們剛剛設(shè)置的優(yōu)化器開始工作。
3.6 測試
print(myNet(x).data)
運行結(jié)果:
可以看到這個結(jié)果已經(jīng)非常接近我們期待的結(jié)果了,當然你也可以換個數(shù)據(jù)測試,結(jié)果也會是相似的。這里簡單解釋下為什么我們的代碼末尾加上了一個.data,因為我們的tensor變量其實是包含兩個部分的,一部分是tensor數(shù)據(jù),另一部分是tensor的自動求導參數(shù),我們加上.data意思是輸出取tensor中的數(shù)據(jù),如果不加的話會輸出下面這樣:
以上就是PyTorch如何搭建一個簡單的網(wǎng)絡(luò)的詳細內(nèi)容,更多關(guān)于PyTorch搭建網(wǎng)絡(luò)的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
pytorch 更改預訓練模型網(wǎng)絡(luò)結(jié)構(gòu)的方法
今天小編就為大家分享一篇pytorch 更改預訓練模型網(wǎng)絡(luò)結(jié)構(gòu)的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-08-08基于np.arange與np.linspace細微區(qū)別(數(shù)據(jù)溢出問題)
這篇文章主要介紹了基于np.arange與np.linspace細微區(qū)別(數(shù)據(jù)溢出問題),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-05-05Python 繼承,重寫,super()調(diào)用父類方法操作示例
這篇文章主要介紹了Python 繼承,重寫,super()調(diào)用父類方法,結(jié)合完整實例形式詳細分析了Python面向?qū)ο蟪绦蛟O(shè)計中子類繼承與重寫父類方法的相關(guān)操作技巧,需要的朋友可以參考下2019-09-09Python中set與frozenset方法和區(qū)別詳解
這篇文章主要介紹了Python中set與frozenset方法和區(qū)別詳解的相關(guān)資料,需要的朋友可以參考下2016-05-05Python第三方庫xlrd/xlwt的安裝與讀寫Excel表格
最近開始學習python,想做做簡單的自動化測試,需要讀寫excel,于是就接觸到了Python的第三方庫xlrd和xlwt,下面這篇文章就給大家主要介紹了Python中第三方庫xlrd/xlwt的安裝與讀寫Excel表格的方法,需要的朋友可以參考借鑒。2017-01-01使用Python對IP進行轉(zhuǎn)換的一些操作技巧小結(jié)
這篇文章主要介紹了使用Python對IP進行轉(zhuǎn)換的一些操作技巧小結(jié),包括使用socket模塊里的相關(guān)函數(shù)和匿名函數(shù)實現(xiàn),需要的朋友可以參考下2015-11-11