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

BNC 連接器接線原理深度剖析

評論