PyTorch如何搭建一個(gè)簡(jiǎn)單的網(wǎng)絡(luò)
1 任務(wù)
首先說(shuō)下我們要搭建的網(wǎng)絡(luò)要完成的學(xué)習(xí)任務(wù): 讓我們的神經(jīng)網(wǎng)絡(luò)學(xué)會(huì)邏輯異或運(yùn)算,異或運(yùn)算也就是俗稱(chēng)的“相同取0,不同取1” 。再把我們的需求說(shuō)的簡(jiǎn)單一點(diǎn),也就是我們需要搭建這樣一個(gè)神經(jīng)網(wǎng)絡(luò),讓我們?cè)谳斎耄?,1)時(shí)輸出0,輸入(1,0)時(shí)輸出1(相同取0,不同取1),以此類(lèi)推。
2 實(shí)現(xiàn)思路
因?yàn)槲覀兊男枨笮枰袃蓚€(gè)輸入,一個(gè)輸出,所以我們需要在輸入層設(shè)置兩個(gè)輸入節(jié)點(diǎn),輸出層設(shè)置一個(gè)輸出節(jié)點(diǎn)。因?yàn)閱?wèn)題比較簡(jiǎn)單,所以隱含層我們只需要設(shè)置10個(gè)節(jié)點(diǎn)就可以達(dá)到不錯(cuò)的效果了,隱含層的激活函數(shù)我們采用ReLU函數(shù),輸出層我們用Sigmoid函數(shù),讓輸出保持在0到1的一個(gè)范圍,如果輸出大于0.5,即可讓輸出結(jié)果為1,小于0.5,讓輸出結(jié)果為0.
3 實(shí)現(xiàn)過(guò)程
我們使用的簡(jiǎn)單的快速搭建法。
3.1 引入必要庫(kù)
import torchimport torch.nn as nnimport numpy as np
用pytorch當(dāng)然要引入torch包,然后為了寫(xiě)代碼方便將torch包里的nn用nn來(lái)代替,nn這個(gè)包就是neural network的縮寫(xiě),專(zhuān)門(mén)用來(lái)搭神經(jīng)網(wǎng)絡(luò)的一個(gè)包。引入numpy是為了創(chuàng)建矩陣作為輸入。
3.2 創(chuàng)建訓(xùn)練集
# 構(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()
我個(gè)人比較喜歡用np.mat這種方式構(gòu)建矩陣,感覺(jué)寫(xiě)法比較簡(jiǎn)單,當(dāng)然你也可以用其他的方法。但是構(gòu)建完矩陣一定要有這一步 torch.tensor(x).float() ,必須要把你所創(chuàng)建的輸入轉(zhuǎn)換成tensor變量。
什么是tensor呢?你可以簡(jiǎn)單地理解他就是pytorch中用的一種變量,你想用pytorch這個(gè)框架就必須先把你的變量轉(zhuǎn)換成tensor變量。而我們這個(gè)神經(jīng)網(wǎng)絡(luò)會(huì)要求你的輸入和輸出必須是float浮點(diǎn)型的,指的是tensor變量中的浮點(diǎn)型,而你用np.mat創(chuàng)建的輸入是int型的,轉(zhuǎn)換成tensor也會(huì)自動(dòng)地轉(zhuǎn)換成tensor的int型,所以要在后面加個(gè).float()轉(zhuǎn)換成浮點(diǎn)型。
這樣我們就構(gòu)建完成了輸入和輸出(分別是x矩陣和y矩陣),x是四行二列的一個(gè)矩陣,他的每一行是一個(gè)輸入,一次輸入兩個(gè)值,這里我們把所有的輸入情況都列了出來(lái)。輸出y是一個(gè)四行一列的矩陣,每一行都是一個(gè)輸出,對(duì)應(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ò),這個(gè)函數(shù)就是那個(gè)可以讓我們像搭積木一樣搭神經(jīng)網(wǎng)絡(luò)的一個(gè)東西。
nn.Linear(2,10)的意思搭建輸入層,里面的2代表輸入節(jié)點(diǎn)個(gè)數(shù),10代表輸出節(jié)點(diǎn)個(gè)數(shù)。Linear也就是英文的線性,意思也就是這層不包括任何其它的激活函數(shù),你輸入了啥他就給你輸出了啥。nn.ReLU()這個(gè)就代表把一個(gè)激活函數(shù)層,把你剛才的輸入扔到了ReLU函數(shù)中去。 接著又來(lái)了一個(gè)Linear,最后再扔到Sigmoid函數(shù)中去。 2,10,1就分別代表了三個(gè)層的個(gè)數(shù),簡(jiǎn)單明了。
3.4 設(shè)置優(yōu)化器
optimzer = torch.optim.SGD(myNet.parameters(),lr=0.05)loss_func = nn.MSELoss()
對(duì)這一步的理解就是,你需要有一個(gè)優(yōu)化的方法來(lái)訓(xùn)練你的網(wǎng)絡(luò),所以這步設(shè)置了我們所要采用的優(yōu)化方法。
torch.optim.SGD的意思就是采用SGD(隨機(jī)梯度下降)方法訓(xùn)練,你只需要把你網(wǎng)絡(luò)的參數(shù)和學(xué)習(xí)率傳進(jìn)去就可以了,分別是 myNet.paramets 和 lr 。 loss_func 這句設(shè)置了代價(jià)函數(shù),因?yàn)槲覀兊倪@個(gè)問(wèn)題比較簡(jiǎn)單,所以采用了MSE,也就是均方誤差代價(jià)函數(shù)。
3.5 訓(xùn)練網(wǎng)絡(luò)
for epoch in range(5000): out = myNet(x) loss = loss_func(out,y) optimzer.zero_grad() loss.backward() optimzer.step()
我這里設(shè)置了一個(gè)5000次的循環(huán)(可能不需要這么多次),讓這個(gè)訓(xùn)練的動(dòng)作迭代5000次。每一次的輸出直接用myNet(x),把輸入扔進(jìn)你的網(wǎng)絡(luò)就得到了輸出out(就是這么簡(jiǎn)單粗暴?。?,然后用代價(jià)函數(shù)和你的標(biāo)準(zhǔn)輸出y求誤差。 清除梯度的那一步是為了每一次重新迭代時(shí)清除上一次所求出的梯度,你就把這一步記住就行,初學(xué)不用理解太深。 loss.backward() 當(dāng)然就是讓誤差反向傳播,接著 optimzer.step() 也就是讓我們剛剛設(shè)置的優(yōu)化器開(kāi)始工作。
3.6 測(cè)試
print(myNet(x).data)
運(yùn)行結(jié)果:
可以看到這個(gè)結(jié)果已經(jīng)非常接近我們期待的結(jié)果了,當(dāng)然你也可以換個(gè)數(shù)據(jù)測(cè)試,結(jié)果也會(huì)是相似的。這里簡(jiǎn)單解釋下為什么我們的代碼末尾加上了一個(gè).data,因?yàn)槲覀兊膖ensor變量其實(shí)是包含兩個(gè)部分的,一部分是tensor數(shù)據(jù),另一部分是tensor的自動(dòng)求導(dǎo)參數(shù),我們加上.data意思是輸出取tensor中的數(shù)據(jù),如果不加的話會(huì)輸出下面這樣:
以上就是PyTorch如何搭建一個(gè)簡(jiǎn)單的網(wǎng)絡(luò)的詳細(xì)內(nèi)容,更多關(guān)于PyTorch搭建網(wǎng)絡(luò)的資料請(qǐng)關(guān)注好吧啦網(wǎng)其它相關(guān)文章!
相關(guān)文章:
1. ASP基礎(chǔ)入門(mén)第四篇(腳本變量、函數(shù)、過(guò)程和條件語(yǔ)句)2. php使用正則驗(yàn)證密碼字段的復(fù)雜強(qiáng)度原理詳細(xì)講解 原創(chuàng)3. jscript與vbscript 操作XML元素屬性的代碼4. Jsp servlet驗(yàn)證碼工具類(lèi)分享5. XML在語(yǔ)音合成中的應(yīng)用6. 基于PHP做個(gè)圖片防盜鏈7. ASP將數(shù)字轉(zhuǎn)中文數(shù)字(大寫(xiě)金額)的函數(shù)8. 基于javaweb+jsp實(shí)現(xiàn)企業(yè)車(chē)輛管理系統(tǒng)9. Jsp+Servlet實(shí)現(xiàn)文件上傳下載 文件列表展示(二)10. HTML5實(shí)戰(zhàn)與剖析之觸摸事件(touchstart、touchmove和touchend)
