簡體   English   中英

了解keras中conv2d層的輸出形狀

[英]Understanding the output shape of conv2d layer in keras

我不明白為什么Keras中conv2D層的輸出尺寸中不包括通道尺寸。

我有以下型號

def create_model():
    image = Input(shape=(128,128,3))

    x = Conv2D(24, kernel_size=(8,8), strides=(2,2), activation='relu', name='conv_1')(image)
    x = Conv2D(24, kernel_size=(8,8), strides=(2,2), activation='relu', name='conv_2')(x)
    x = Conv2D(24, kernel_size=(8,8), strides=(2,2), activation='relu', name='conv_3')(x)
    flatten = Flatten(name='flatten')(x)

    output = Dense(1, activation='relu', name='output')(flatten)
    model = Model(input=image, output=output)
    return model

model = create_model()
model.summary()

我的問題結尾處給出了模型摘要的圖。 輸入層拍攝的RGB圖像的寬度為128,高度為128。第一個conv2D層告訴我輸出尺寸為(None,61,61,24)。 我使用的內核大小為(8,8),跨度為(2,2)沒有填充。 值61 = floor((128-8 + 2 * 0)/ 2 + 1)和24(內核/過濾器數)是有意義的。 但是,為什么維度中沒有包含不同渠道的維度? 據我所知,每個通道上的24個濾波器的參數都包含在參數數量中。 因此,我希望輸出尺寸為(None,61,61,24,3)或(None,61,61,24 * 3)。 這只是Keras中的一個奇怪表示法,還是我對其他事情感到困惑?

在此處輸入圖片說明

我的猜測是您誤解了卷積層是如何定義的。

我對卷積層形狀的表示是(out_channels, in_channels, k, k) ,其中k是內核的大小。 out_channels是過濾器(即卷積神經元)的數量。 考慮以下圖像:

卷積圖

圖片中的3d卷積核權A_{i-1} (即輸入圖像)的不同數據窗口之間滑動。 該形狀的圖像(in_channels, k, k)的3D數據(in_channels, k, k)與匹配維數的各個3d卷積核配對。 有多少個這樣的3d內核? 作為輸出通道數out_channels 內核采用的深度尺寸是A_{i-1}in_channels 因此, A_{i-1}的尺寸in_channels被深度點積所收縮,該點積建立了具有out_channels通道的輸出張量。 構造滑動窗口的精確方式由采樣元組( kernel_size, stride, padding)定義,並導致輸出張量的空間尺寸由正確應用的公式確定。

如果你想了解更多,包括反向傳播和實施看一看這個文件。

您使用的公式是正確的。 可能會有點混亂,因為許多流行的教程使用的過濾器數量等於圖像中的通道數量。 TensorFlow / Keras實現通過計算num_input_channels * num_output_channels大小為(kernel_size[0], kernel_size[1])中間特征圖來產生輸出。 因此,對於每個輸入通道,它會生成num_output_channels特征圖,然后將它們相乘並連接在一起,以創建(kernel_size[0], kernel_size[1], num_output_channels)輸出形狀。希望這可以弄清Vlad的詳細答案

每個卷積濾波器(8 x 8)連接到圖像所有通道的 (8 x 8)接收場。 這就是為什么我們將(61,61,24)作為第二層的輸出。 不同的通道被隱式編碼為24個濾波器的權重。 這意味着,每個過濾器沒有8 x 8 = 64權重,而是8 x 8 x通道數= 8 x 8 x 3 = 192權重。

請參閱CS231的報價 在此處輸入圖片說明

左:紅色示例輸入體積(例如32x32x3 CIFAR-10圖像),以及第一卷積層中神經元的示例體積。 卷積層中的每個神經元在 空間上 僅連接到 輸入體積中 的局部 區域,但連接到整個深度(即所有 顏色通道) 請注意,沿着深度有多個神經元(在此示例中為5個),所有神經元都看着輸入中的相同區域-請參見下面文本中有關深度列的討論。 右:“神經網絡”一章中的神經元保持不變:它們仍然計算其權重與輸入的點積,然后是非線性,但是它們的連接性現在僅限於局部空間。

這個問題在互聯網上以各種形式提出,並且有一個簡單的答案,通常會被遺漏或混淆:

簡單的回答:給定多通道輸入(例如彩色圖像)的Keras Conv2D層將在所有顏色通道上應用濾鏡並求和,得出與單色卷積輸出圖像等效的結果。

來自keras.io網站cifar CNN的示例

(1)您正在使用CIFAR圖像數據集進行訓練,該數據集由32x32 彩色圖像組成,即每個圖像都是形狀(32,32,3)(RGB = 3通道)

(2)您網絡的第一層是Conv2D層,其中包含32個濾鏡,每個濾鏡指定為3x3,因此:

Conv2D(32,(3,3),padding ='same',input_shape =(32,32,3))

(3)與直覺相反,Keras將每個濾鏡配置為(3,3,3),即覆蓋3x3像素加上所有顏色通道的3D體積。 作為一個次要細節,按照常規神經網絡層算法,每個過濾器都有一個BIAS值的附加權重。

(4)卷積絕對正常進行,除了輸入圖像的3x3x3 VOLUME在每個步驟中使用3x3x3濾鏡進行卷積,並且在每個步驟中產生單個(單色)輸出值(即像素)。

(5)結果是在(32,32,3)圖像上指定(3,3)濾鏡的Keras Conv2D卷積產生(32,32)結果,因為使用的實際濾鏡為(3,3,3) 。

(6)在此示例中,我們還在Conv2D層中指定了32個濾鏡,因此每個輸入圖像的實際輸出為(32,32,32)(即,您可以將其視為32個圖像,每個濾鏡一個,每個32x32單色像素)。

作為檢查,您可以查看由model.summary()生成的圖層的權重計數(參數#):

Layer (type)         Output shape       Param#
conv2d_1 (Conv2D)   (None, 32, 32, 32)  896

有32個濾鏡,每個濾鏡3x3x3(即27個權重)加上1個偏差(即每個濾鏡共28個權重)。 32個過濾器x 28個權重= 896個參數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM