1. 程式人生 > >Tensorflow中tf.nn.conv2d的實現原理

Tensorflow中tf.nn.conv2d的實現原理

先解釋一下tf.nn.conv2d函式:

tf.nn.conv2d(input, filter, strides, padding, use_cudnn_on_gpu=None, data_format=None, name=None):

給定一個input的張量[batch, in_height, in_width, in_channels]和一個過濾器 / 核心張量 [filter_height, filter_width, in_channels, out_channels]後,執行以下操作:

    1.展平filter為一個形狀為[filter_height * filter_width * in_channels, output_channels]

的二維矩陣。

    2.從input中按照filter大小提取圖片子集形成一個大小為[batch, out_height, out_width, filter_height * filter_width * in_channels]的虛擬張量。

    3.迴圈每個圖片子集,右乘filter矩陣。

除去name引數用以指定該操作的name,與方法有關的一共五個引數:

第一個引數input:指需要做卷積的輸入影象,它要求是一個Tensor,具有[batch, in_height, in_width, in_channels]這樣的shape,具體含義是[訓練時一個batch的圖片數量, 圖片高度, 圖片寬度, 影象通道數],注意這是一個4維的Tensor,要求型別為float32和float64其中之一

第二個引數filter:相當於CNN中的卷積核,它要求是一個Tensor,具有[filter_height, filter_width, in_channels, out_channels]這樣的shape,具體含義是[卷積核的高度,卷積核的寬度,影象通道數,卷積核個數],要求型別與引數input相同,有一個地方需要注意,第三維in_channels,就是引數input的第四維

第三個引數strides:卷積時在影象每一維的步長,這是一個一維的向量,長度4

第四個引數padding:string型別的量,只能是"SAME","VALID"其中之一,這個值決定了不同的卷積方式(後面會介紹)

第五個引數:use_cudnn_on_gpu:bool型別,是否使用cudnn加速,預設為true

結果返回一個Tensor,這個輸出,就是我們常說的feature map,shape仍然是[batch, height, width, channels]這種形式。

但是,我想說的並不是這些,而是:

Implementing convolution as a matrix multiplication

也就是上面紅色字型的實現:


CNN中的卷積操作


而:


下圖為一個具體的例子,看懂下面這個圖應該就會清楚上面的做法。


而,剛才介紹的tf.nn.conv2d()裡的卷積操作個這個是類似的,只是旋轉了一下。

參考文獻: