卷積操作的維度計算是定義神經網絡結構的重要問題,在使用如PyTorch、Tensorflow等深度學習框架搭建神經網絡的時候,對每一層輸入的維度和輸出的維度都必須計算準確,否則容易出錯,這里將詳細說明相關的維度計算。
一、卷積操作的維度計算
卷積操作的維度計算是定義神經網絡結構的重要問題,在使用如PyTorch、Tensorflow等深度學習框架搭建神經網絡的時候,對每一層輸入的維度和輸出的維度都必須計算準確,否則容易出錯,這里將詳細說明相關的維度計算。
首先,我們看一下卷積操作涉及的東西,一個卷積操作需要定義卷積核的大小、輸入圖像的padding長度以及卷積操作的步長。以一個RGB圖像輸入為例,一個多卷積核操作的示意圖如下:
使用兩個卷積核掃描輸入圖像
這個例子的輸入數據是一個三維數據,帶有通道數,輸入數據第三個維度是通道數,使用了兩個卷積核(濾波器)掃描得到一個帶有兩個通道的圖像(一個卷積核對一個三維的數據,即帶多個通道的二維圖像掃描可以得到一個二維單通道圖像結果,要求卷積核也是三維,且通道數和輸入數據通道數一樣)。下面我們來描述具體計算。
假設輸入數據大小是w × h,其中,w是寬度,h是高度。掃描的卷積核大小是f × f。padding的長度是p(padding),步長是s(stride)。那么經過卷積操作之后,輸出的數據大小:
如果輸入的數據是三維數據,即:w × h × c。其中,w是寬度,h是高度,c是通道數(對于RGB圖像輸入來說,這個值一般是3,在文本處理中,通常是不同embedding模型的個數,如采用騰訊訓練的、谷歌訓練的等)。這個時候的卷積核通常也是帶通道的三維卷積核:f × f × c。
注意,一般來說,卷積核的通道數c和輸入數據的通道數是一致的。因此,這個時候卷積之后的輸出依然是一個二維數據,其大小為:
這里的維度做了向下取整,防止結果不是整數的情況。假如希望輸出的也是帶通道的結果,那么這時候就要使用多個卷積核來操作了,最終輸出的數據維度是:
其中c'是卷積核的個數。
二、深度學習框架中Conv1d、Conv2d
在像PyTorch、Tensorflow中,都有類似Conv1d、Conv2d和Conv3d的操作。這也都和卷積操作的維度有關,里面的參數都要定義好。例如如下的卷積操作:
self.convs = nn.Sequential( nn.Conv1d(in_channels=32, out_channels=16, kernel_size=5, stride=1, padding=0), nn.BatchNorm1d(16), nn.ReLU(inplace=True) )
這里面的參數要定義好,否則容易出錯。我們將分別介紹。
Conv1d是一維卷積操作,它要求輸入的數據是三維的,即:N × C_in × L_in。
最終輸出的參數也是三維的:N × C_out × L_out。
這里的N是mini batch size,C是通道數量,L是寬度。
這里的out_channels定義了將由幾個卷積核來掃描,kernel_size則定義了每一個卷積核大小,都可以自己定義。最終,輸出的min_batch_size不變,out_channels數量根據定義的參數來,而輸出的width計算如下:
這里的p是上面padding的參數值,f是kernel_size的值。類似的,如果使用Conv2D做卷積操作,那么輸入就是四維的:N × C_in × H_in × W_in。
這里的N是min batch size,C_in是輸入數據的通道數,H_in是輸入數據的高度,W_in是輸入數據的寬度。其輸出也是四維的,根據定義的卷積核大小和數量得到的輸出維度如下:N × C_out × H_out × W_out。其中,C_out是根據卷積核的數量定義的輸出數據的通道數,因為一個卷積核只能掃描得到一個二維圖。其中H_out 和 W_out的計算如下:
三、總結
卷積操作的輸入和輸出數據的維度在構建神經網絡中很重要,也很容易出錯。使用PyTorch或者Tensoflow構建卷積神經網絡的時候一定要注意參數的設置,如果計算錯誤,下一層的輸入與上一層的輸出對不上那么很有可能失敗。為了避免這種情況發生,可以先用小數據集測試,同時為了檢測哪里出錯可以在測試的時候把每一層的輸出結果的維度(shape)打印出來,這樣就更容易檢測結果了。
編輯:jq
-
濾波器
+關注
關注
161文章
7859瀏覽量
178703 -
RGB
+關注
關注
4文章
801瀏覽量
58641 -
卷積
+關注
關注
0文章
95瀏覽量
18532
發布評論請先 登錄
相關推薦
評論