卷積神經網絡中各個卷積層的設置及輸出大小計算的詳細講解

我將從以下幾個方面來進行解說:
1.卷積神經網絡的結構
2.卷積神經網絡的計算
3.以AlexNet爲例進行詳細講解

4.常見的兩個卷積層設置的問題

1.卷積神經網絡的結構

卷積神經網絡(CNN)由輸入層、卷積層、激活函數、池化層、全連接層組成,即INPUT(輸入層)-CONV(卷積層)-RELU(激活函數)-POOL(池化層)-FC(全連接層)
我們用一個圖進行展示:
在這裏插入圖片描述

2.卷積神經網絡的計算

卷積神將網絡的計算公式爲:
N=(W-F+2P)/S+1
其中N:輸出大小
W:輸入大小
F:卷積核大小
P:填充值的大小
S:步長大小
下面舉個例子看一下:

   nn.Conv2d(in_channels=3,out_channels=96,kernel_size=11,stride=4,padding=2)

卷積一層的幾個參數:
in_channels=3:表示的是輸入的通道數,由於是RGB型的,所以通道數是3.
out_channels=96:表示的是輸出的通道數,設定輸出通道數的96(這個是可以根據自己的需要來設置的)
kernel_size=12:表示卷積核的大小是12x12的,也就是上面的 “F”, F=12
stride=4:表示的是步長爲4,也就是上面的S, S=4
padding=2:表示的是填充值的大小爲2,也就是上面的P, P=2

假如你的圖像的輸入size是256x256的,由計算公式知N=(256-12+2x2)/4+1=63,也就是輸出size爲63x63的

3.以AlexNet爲例進行詳細講解

AlexNet網絡結構圖如下圖所示:
在這裏插入圖片描述
有結構圖可以看出該網絡有8層:五個卷積層,三個全連接層。

我們利用的框架是pytorch。

卷積神經網絡的設置包括卷積層的設置以及正反向傳播的設置
卷積層的設置代碼如下:

    self.conv1 = torch.nn.Sequential(   #input_size = 227*227*3
        torch.nn.Conv2d(in_channels=3,out_channels=96,kernel_size=11,stride=4,padding=0),
        torch.nn.ReLU(),
        torch.nn.MaxPool2d(kernel_size=3, stride=2) #output_size = 27*27*96
    )
    self.conv2 = torch.nn.Sequential(   #input_size = 27*27*96
        torch.nn.Conv2d(96, 256, 5, 1, 2),
        torch.nn.ReLU(),
        torch.nn.MaxPool2d(3, 2)    #output_size = 13*13*256
    )
    self.conv3 = torch.nn.Sequential(   #input_size = 13*13*256
        torch.nn.Conv2d(256, 384, 3, 1, 1),
        torch.nn.ReLU(),    #output_size = 13*13*384
    )
    self.conv4 = torch.nn.Sequential(   #input_size = 13*13*384
        torch.nn.Conv2d(384, 384, 3, 1, 1),
        torch.nn.ReLU(),    #output_size = 13*13*384
    )
    self.conv5 = torch.nn.Sequential(   #input_size = 13*13*384
        torch.nn.Conv2d(384, 256, 3, 1, 1),
        torch.nn.ReLU(),
        torch.nn.MaxPool2d(3, 2)    #output_size = 6*6*256
    )

self.dense = torch.nn.Sequential(
torch.nn.Linear(9216, 4096),
torch.nn.ReLU(),
torch.nn.Dropout(0.5),
torch.nn.Linear(4096, 4096),
torch.nn.ReLU(),
torch.nn.Dropout(0.5),
torch.nn.Linear(4096, 50)
)

下面我們一層一層的進行分析
卷積一層:

self.conv1 = torch.nn.Sequential(   #input_size = 227*227*3
            torch.nn.Conv2d(in_channels=3,out_channels=96,kernel_size=11,stride=4,padding=0),
            torch.nn.ReLU(),
            torch.nn.MaxPool2d(kernel_size=3, stride=2) #output_size = 27*27*96
        )

下面詳細介紹一下下

self.conv1 = torch.nn.Sequential(   #input_size = 227*227*3

可以看到我們的輸入爲227x227x3的,也就是所size爲227x227的,通道數是3,爲RGB型圖像

 torch.nn.Conv2d(in_channels=3,out_channels=96,kernel_size=11,stride=4,padding=0),

有上面的介紹我們可以計算出其輸出的大小爲:N=(227-11+2x0)/4+1=55,即卷積後的尺寸是96x55x55的
神經元數目爲555596 =290400個,本層的神經元數目爲2727256 =186642個
激活函數Relu,在神經網絡中的作用是:通過加權的輸入進行非線性組合產生非線性決策邊界
簡單的來說就是增加非線性作用。
在深層卷積神經網絡中使用激活函數同樣也是增加非線性,主要是爲了解決sigmoid函數帶來的梯度消失問題。
關於Rule的具體指知識,這裏不做詳細的描述,以後再進行詳細講解

torch.nn.MaxPool2d(kernel_size=3, stride=2) #output_size = 27*27*96

MaxPool 最大池化層,池化層在卷積神經網絡中的作用在於特徵融合和降維。池化也是一種類似的卷積操作,只是池化層的所有參數都是超參數,是學習不到的。
這裏的最大池化操作:將2x2尺寸內的所有像素值取最大值作爲輸出通道的像素值。
輸出大小的計算和卷積層的計算過程一樣就是利用公式N=(W-F+2P)/S+1,由公式計算得知,該輸出大小
N=(55-3+2x0)/2+1=27,則輸出爲96x27x27,
卷積二層

self.conv2 = torch.nn.Sequential(   #input_size = 27*27*96
    torch.nn.Conv2d(96, 256, 5, 1, 2),
    torch.nn.ReLU(),
    torch.nn.MaxPool2d(3, 2)    #output_size = 13*13*256
)

我們可以看到卷積2層的輸入爲96x27x27的,也就是上一層的輸出,從這裏也就知道,上一層的輸出爲下一層的輸入。
卷積2層的計算過程和卷積1層的計算過程是一樣的,具體不在詳細描述
卷積2層最終輸出爲13x13x256,本層的神經元數目爲27x27x256 =186642個
卷積3層最終輸出爲13x13x384,本層的神精元數目爲13x13x384 =64896個
卷積4層最終輸出爲13x13x384,本層的神精元數目爲13x13x384 = 64896個
卷積5層最終輸出爲6x6x256,本層的神精元數目爲6x6x256=9216個
卷積層介紹完了,下面看一下全連接層(Linear)
全連接層的作用主要是負責邏輯推斷,所有的參數都必須學習得到。

self.dense = torch.nn.Sequential(
        torch.nn.Linear(9216, 4096),
        torch.nn.ReLU(),
        torch.nn.Dropout(0.5),
        torch.nn.Linear(4096, 4096),
        torch.nn.ReLU(),
        torch.nn.Dropout(0.5),
        torch.nn.Linear(4096, 50)
    )

可以看到有3三層全連接層(與上面相連接,也就是第六、七、八層)

torch.nn.Linear(9216, 4096)

第一層全連接層(第六層)的作用有兩個
第一:鏈接卷積層的輸出
第二:去除空間信息(通道數),是一種將三維矩陣轉變成向量的過程(一種全卷積操作)
其操作可以看成是輸入圖像爲WxHxC,卷積核的尺寸爲WxHxC,這樣卷積後的尺寸爲1x1x1,這樣整個出入圖像變成了一個數,一共有K個數(第一層全連接層後的神經元數)。
第6層輸入數據的尺寸是6x6x256,採用6x6x256尺寸的濾波器對第六層的輸入數據進行卷積運算;每個6x6x256尺寸的濾波器對第六層的輸入數據進行卷積運算生成一個運算結果,通過一個神經元輸出這個運算結果;共有4096個6x6x256尺寸的濾波器對輸入數據進行卷積,通過4096個神經元的輸出運算結果;然後通過ReLU激活函數以及dropout運算輸出4096個本層的輸出結果值。

第二層全連接層(第七層):
第6層輸出的4096個數據與第7層的4096個神經元進行全連接,然後經由ReLU和Dropout進行處理後生成4096個數據。

第三層全連接層(第八層):
第7層輸入的4096個數據與第8層的50個神經元進行全連接,經過訓練後輸出被訓練的數值。
正反向傳播的順序設置代碼如下:

def forward(self, x):   #正向傳播過程
    conv1_out = self.conv1(x)
    conv2_out = self.conv2(conv1_out)
    conv3_out = self.conv3(conv2_out)
    conv4_out = self.conv4(conv3_out)
    conv5_out = self.conv5(conv4_out)
    res = conv5_out.view(conv5_out.size(0), -1)
    out = self.dense(res)
    #print (out)
    return out

這裏的順序就是:

  1. 開始的數據的輸入作爲第一層卷積層的輸入,得到第一層卷積層的輸出;
  2. 第一層卷積的輸出作爲第二層卷積層的輸入,得到第二層卷積層的輸出:
  3. 第二層卷積的輸出作爲第三層卷積層的輸入,得到第三層卷積層的輸出:
  4. 第三層卷積的輸出作爲第四層卷積層的輸入,得到第四層卷積層的輸出:
  5. 第四層卷積的輸出作爲第五層卷積層的輸入,得到第五層卷積層的輸出:
  6. 第五層卷積層的輸出轉變爲一維向量形式作爲第一層全連接層的輸入,得到第一層全連接層的輸出;
  7. 第一層全連接層的輸出與第二層全連接層的神經元進行全連接得到第二層全連接層的輸出;
  8. 第二層全連接層的輸出與第三層全連接層的神經元進行全連接得到第三層全連接層的輸出,也就是我們想要的參數。

4.常見的兩個卷積層設置問題

 self.conv1 = nn.Conv2d(3, 6, 5)

問題一:爲什麼是cove2d?

cove1d:用於文本數據,只對寬度進行卷積,對高度不進行卷積
cove2d:用於圖像數據,對寬度和高度都進行卷積

問題二:爲什麼卷積核大小5x5寫一個5?

Conv2d(輸入通道數, 輸出通道數, kernel_size(長和寬)),當卷積核爲方形時,只寫一個就可以
卷積核不是方形時,長和寬都要寫:

self.conv1 = nn.Conv2d(3, 6, (5,3))

問題三:池化層的作用

maxpooling有局部不變性而且可以提取顯著特徵的同時降低模型的參數,從而降低模型的過擬合。
因爲只是提取了顯著特徵,而捨棄了不顯著的信息,是的模型的參數減少了,從而一定程度上可以緩解過擬合的產生。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章