PyTorch框架:(5)使用PyTorch框架构建卷积神经网络
基于pytorch構建一個非常簡單的卷積神經網絡,以Mnist數據集為例演示基本的流程
?
1、導工具包
?2、讀取數據
(把該寫的超參數全部寫出來)
PS:當前輸入圖像的大小,注意這里使用卷積網絡處理Mnist數據他就不是一個一個像素點了,既然我們要用卷積網絡去做,那輸入的他得是一張圖像,對于一張圖像我們現在的輸入得是28x28x1的三維的數據,我們現在需要的數據他是三維的他是三維的。
?3、卷積網絡模塊構建
?
?定義的conv1不光是做了一個卷積,他是一個卷積模塊,包含了卷積、池化、Relu全部加進去了,
?定義conv2也是一個卷積模塊;
在做卷積層的時候其實很簡單,需要在nn模塊當中,把Conv2d拿出來就可以了,其中:
in_channel:表示當前輸入的特征圖個數,對于第一個卷積來說,他的輸入應該是我們的Mnist數據,這個數據是一個灰度圖,所以說他的In_channels=1,這是我輸入的顏色通道,或者說輸入特征圖的個數;
out_channels:表示輸出特征圖的個數,就是說你用多少個卷積核來對當前數據或者對當前的這個圖進行特征提取,這里的16表示你用16個卷積核,16個不同的卷積核,肯定會得到16個不同的特征圖,所以out這里的意思就是你想得到多少個特征圖的意思;
kernel_size:表示我們現在做卷積,你得告訴我我每隔多大的區域進行特征提取,這里等于5就是我用一個5x5的區域來去在當前原始的輸入圖像當中進行特征提取,kernel_size=5表示卷積核的大小;
stride:表示當前的步長;我在做卷積的窗口進行滑動過程當中,每隔幾個單元滑動,一般情況下步長都是為1的。
padding:表示做邊緣填充;這里為2表示加2圈0。
PS:如果不想寫這些參數的名字,直接向nn.Conv2d那樣直接全部輸入數字也行。
在nn.Conv2d中的16表示輸入,之前輸入是1表示灰度圖默認就是1,
?這里的16表示(大家記住一點就是我當前這個卷積層他的輸入大小就是之前得到多少個特征圖)之前得到的16個特征圖,所以這里我們的輸入也是16;
32表示使用32個卷積核去提取特征,得到的是32個圖;
5表示kernel_size=5;
3.1、拉伸操作
在做卷積的時候,最后不管是卷積層還是Relu層還是pooling層,無論這三個層中的哪一個,我們最終得到的都是一個特征圖,所謂這個特征圖不考慮batch_size的前提下,他是一個三維的,比如我最終得到的是一個32x32x256的結果,他是一個圖,他不是一個矩陣,我們最終需要得到一個10分類的結果,怎么樣得到一個10分類的結果呢?現在我需要把這個立體的東西給他拉長,轉成一個矩陣或者說是向量,比如說這里他是一個2048維度(假設的)的向量,接下來我連接上一個全連接層(一個權重參數w,一個偏置參數b),我就能得到我最終預測出來的一個結果,比如說10個類別,我就能夠去做了。
PS:所以說這里我得多做一步,把當前得到的特征圖,給他拉長,拉成一個長向量,基于這個向量我才能對他做一個全連接層,得到最終的一個預測結果,所以這里有一步拉長的操作。
?在做拉長操作之前還得做一件事,我們得知道,你最后一層這個全連接層里邊這個w他的一個維度,w的第2維度很簡單肯定是個10,因為得到的是10個類別,第一個維度就是你得到這個特征圖里邊他有多少個特征,這里的2048就是把3個數乘在一起, 所以在做卷積的時候最后得到的這個特征圖他的規格,它的大小是等于多少。
這里我們計算一下他得到的特征圖大小是多少?
一開始輸入是28x28x1--------------------->經過第一個卷積層之后得到28x28x16(因為用了16個卷積核)------------->經過Relu不變還是28x28x16------------->經過最大池化層是14x14x16,------------>經過第二個卷積層是14x14x32(因為用了32個卷積核)------------->經過Relu不變還是14x14x32------------->經過最大池化層是7x7x32,所以最終的w第一個維度就等于1568=7x7x32,第二個維度是10;
根據計算公式:
?所以寫了一個最終輸出層,輸出層里邊我們是全連接操作,然后全連接里邊他是32X7x7表示經過這幾次卷積之后得到的一個結果,10就是最終想要輸出的類別的個數。
3.2、把網絡串起來
之后進行前向傳播,前向傳播比較簡單,一開始經過conv1,再經過conv2,下一句特別的,做了一個reshape操作(x=x.view(x.size(0),-1)),這個reshape操作就是剛才說的咱們得把當前結果轉化成全部向量的格式(因為下一層要做全連接了),接下來用向量再乘上我的全連接層,就是wx+b,最終就得到了當前這個輸入屬于10個類別中的各自的一個結果。
4、評估
評估函數計算一下當前的準確率。
?5、訓練網絡模型
?把一開始定義的CNN拿到手,定義損失函數,指定優化器。接下來遍歷每個epoch,每個epoch里邊我一個batch一個batch的取數據,然后定義一個train模塊(net.train()),然后在train模塊當中更新我們的一個權重參數,就可以了;
每隔一百次可以去在驗證集上看一下當前驗證集的效果等于多少;接下來計算準確率打印當前結果;
總結
以上是生活随笔為你收集整理的PyTorch框架:(5)使用PyTorch框架构建卷积神经网络的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PyTorch框架:(4)如何去构建数据
- 下一篇: PyTorch框架:(6)图像识别实战常