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