PyTorch框架:(3)使用PyTorch框架构构建神经网络分类任务
目錄
0、背景
1、分類任務(wù)介紹:
?2、網(wǎng)絡(luò)架構(gòu)
?3、手寫網(wǎng)絡(luò)
3.1、讀取數(shù)據(jù)集
3.2、查看數(shù)據(jù)集
3.3將x和y轉(zhuǎn)換成tensor的格式
3.4、定義model
0、背景
其實(shí)分類和回歸本質(zhì)上沒有太大區(qū)別,只是說最終得到的結(jié)果是不同的,以及使用的損失函數(shù)是不同的,中間的網(wǎng)絡(luò)架構(gòu)相對(duì)于來說是比較固定的。
1、分類任務(wù)介紹:
?分類任務(wù)中標(biāo)簽的設(shè)計(jì)稍微不同,比如上圖中的9他預(yù)測出來就是123456789中的哪一個(gè),不是這樣的,而是我們的標(biāo)簽他也是一個(gè)one_hot encoding的編碼,這個(gè)one_hot encoding的編碼我們要得到的最終他預(yù)測的一個(gè)結(jié)果不是一個(gè)值而是10個(gè)值(0到9這10個(gè)數(shù)),我們得到的是當(dāng)前這個(gè)輸入它屬于0到9各自的可能性(比如上圖0.12表示屬于1的概率是12%,屬于9的概率是87%);最終在分類任務(wù)當(dāng)中得到的一個(gè)結(jié)果是:比如說你做10分類,最終得到的結(jié)果是10個(gè)概率值,表示他分別屬于每一個(gè)類的概率值,那么100分類的話就會(huì)得到100個(gè)概率值,這個(gè)就是基于當(dāng)前輸入,得到我最終結(jié)果的一個(gè)過程。結(jié)果是這樣的概率值,所以標(biāo)簽我得是跟結(jié)果一致的條件才行,如果說在這里我們拿到的標(biāo)簽他不是一個(gè)50000x10的,需要再把它做一個(gè)one_hot encoding,對(duì)標(biāo)簽來說是一樣的,如果標(biāo)簽是9的話,那我one_hot encoding就是(0000000001),所以意思就是我們的結(jié)果是one_hot encoding編碼那么我們的標(biāo)簽也要相應(yīng)的轉(zhuǎn)化成one_hot encoding編碼的形式。
?2、網(wǎng)絡(luò)架構(gòu)
?3、手寫網(wǎng)絡(luò)
3.1、讀取數(shù)據(jù)集
?
會(huì)判斷你有沒有下載過Mnist數(shù)據(jù)集,如果沒下載過,他會(huì)自動(dòng)幫你下載。
?解壓文件。
3.2、查看數(shù)據(jù)集
?讀進(jìn)來一張圖像,50000是樣本數(shù),784=28x28x1=h x w x c(長寬高和顏色通道),Mnist數(shù)據(jù)集是黑白圖,他只有一個(gè)顏色通道,可以把784當(dāng)做特征數(shù)。
3.3將x和y轉(zhuǎn)換成tensor的格式
3.4、定義model
介紹functional的方法:
有時(shí)間使用nn.Module,有時(shí)間使用nn.functional的方法?Module里邊有的,functional里邊也有,如何選擇??
所以一般是模型中有帶學(xué)習(xí)參數(shù)的,比如說一些卷積層和一些全連接層,但凡帶參數(shù)的我們使用nn.Module;一些激活函數(shù)或者是一些損失函數(shù),但凡這些不帶參數(shù)的沒有w和b的我們就用nn.functional里邊的方法,這樣更直接一些。
?分類問題一般使用交叉熵?fù)p失函數(shù),所以這里直接調(diào)用functional里邊的cross_entropy(所以這里就是在functional當(dāng)中有很多不帶參數(shù)類似于激活函數(shù),損失函數(shù)這些都是直接拿functiuonal當(dāng)中的直接調(diào)用)。
指定batch_size=64,將x_batch和y_batch全部取出來,定義偏執(zhí)參數(shù)。然后就是如何得到一個(gè)損失值,直接把loss_func拿到手,里邊需要傳進(jìn)來的是當(dāng)前的一個(gè)預(yù)測值和標(biāo)簽值,定義的model函數(shù)就是預(yù)測值,yb就是標(biāo)簽值,預(yù)測和標(biāo)簽都有了就可以得到他實(shí)際的損失值,所以通過function當(dāng)中調(diào)用的一些函數(shù),我們是可以直接拿過來進(jìn)行計(jì)算的。
介紹Module的方法:?
這個(gè)方法用的比較多,在一些正規(guī)的項(xiàng)目或者是比較大型的項(xiàng)目中用的比較多,比如是這樣構(gòu)建自己的網(wǎng)絡(luò)的:
?
?先把nn導(dǎo)進(jìn)來,定義一個(gè)類構(gòu)建自己的網(wǎng)絡(luò),一定要去繼承不只是光定義一個(gè)類,繼承的就是你導(dǎo)進(jìn)來的nn,nn.module一定要去繼承,不做繼承后邊寫的東西都沒用,都白寫,因?yàn)楹芏嗪诵墓δ芏际窃谶@個(gè)里邊寫好了,我們直接繼承過來就行了,不光要去繼承,還得把他的構(gòu)造函數(shù)給拿出來,先定義一個(gè)方法def __init__(self),里邊繼承一下人家的構(gòu)造函數(shù),super.__init__(),接下來定義自己的模塊,隱層和輸出層,這里邊只是定義有哪些層,我們一會(huì)是要用到,。
用到的時(shí)候怎么用,就要下邊再寫一個(gè)方法,再定義一個(gè)forward方法,forward方法的意思就是在這里你不用去寫反向傳播了,反向傳播是pytorch框架人家自動(dòng)幫你去做的,只要你把前向傳播定義好,整個(gè)網(wǎng)絡(luò)圖就有了,有了網(wǎng)絡(luò)圖之后,人家會(huì)自動(dòng)的幫你計(jì)算反向傳播,所以這里不用麻煩的再寫一個(gè)反向傳播,只用寫一個(gè)前向傳播就可以了,def forward(self,x)前向傳播里邊有一個(gè)輸入,這些參數(shù)可以隨意寫,有哪些輸入,這里有了輸入,先通過哪個(gè)層就是我們之前定義的層,第一個(gè)是定義的hidden層,x輸入進(jìn)去傳進(jìn)到hidden層,調(diào)用F里邊的激活函數(shù);將第一個(gè)隱層結(jié)果傳入到第二個(gè)隱層,第三步再傳到我的輸出層得到最終的一個(gè)結(jié)果,再把結(jié)果return回去就可以了。
PS:實(shí)際在做神經(jīng)網(wǎng)絡(luò)或者模型的時(shí)候,最主流的方法就是我自己定義一個(gè)類,在這個(gè)類里邊繼承nn.Module模塊,寫好繼承構(gòu)造函數(shù),然后寫好有哪些層,這是初始化方法;初始完之后,寫一個(gè)前向傳播,前向傳播里邊寫一個(gè)輸入,基于輸入一步步的去走,看得到的結(jié)果,然后返回回去就完事了,這個(gè)就是前向傳播,反向傳播我們不用自己去寫,它會(huì)自動(dòng)的幫我們完成這樣一件事;
定義完網(wǎng)絡(luò)之后,我們可以查看這個(gè)網(wǎng)絡(luò)里邊都有什么東西,所以首先把這個(gè)類給他實(shí)例化出來,net表示我們剛才構(gòu)造好的這個(gè)網(wǎng)絡(luò),打印net看一下。
? net是定義好的網(wǎng)絡(luò),寫一個(gè)循環(huán)展示一下網(wǎng)絡(luò)當(dāng)前的名字以及參數(shù),把所有的參數(shù)全部進(jìn)行一個(gè)打印:(所以可以看出我們定義好net網(wǎng)絡(luò)之后,人家已經(jīng)自動(dòng)的幫我們初始化了w和b)
?
?
?
?---------------------上述就是如何去構(gòu)建一個(gè)網(wǎng)絡(luò)--------?
總結(jié)
以上是生活随笔為你收集整理的PyTorch框架:(3)使用PyTorch框架构构建神经网络分类任务的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PyTorch框架:(2)使用PyTor
- 下一篇: PyTorch框架:(4)如何去构建数据