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