1. 程式人生 > >tf.nn.max_pool 和tf.nn.conv2d 函式的引數問題

tf.nn.max_pool 和tf.nn.conv2d 函式的引數問題

 

我們看一下 tf.nn.max_pool 這個函式

(還有tf.nn.conv2d 函式)

這兩個函式是CNN中兩個比較常用的函式,一個是池化層的計算,另一個則是卷積層的計算.。

我們從他們的引數開始,

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

除去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。

[ 1, strides, strides, 1],我們姑且認為第一位和最後一位固定必須是1

 

第四個引數padding:string型別的量,只能是"SAME","VALID"其中之一,這個值決定了不同的卷積方式(也就是我們本次的主題)。

第五個引數:use_cudnn_on_gpu:bool型別,是否使用cudnn加速,預設為true; 結果返回一個Tensor,這個輸出,就是我們常說的feature map,shape仍然是[batch, height, width, channels]

這種形式。

我們來看一個例項



valid_pad = tf.nn.max_pool(x,[1,2,2,1],[1,2,2,1],padding='VALID')

.

對於這樣的一個例項,我們可以讀出以下的內容:  輸出為x ,  卷積核(這裡並不是卷積核,只是意義上的類似)的大小為【2x2】,  移動的步長的橫向為2,縱向也為2

 

tf.nn.max_pool(value, ksize, strides, padding, name=None)

引數是四個,和卷積很類似:

第一個引數value:需要池化的輸入,一般池化層接在卷積層後面,所以輸入通常是feature map,依然是[batch, height, width, channels]這樣的shape

第二個引數ksize:池化視窗的大小,取一個四維向量,一般是[1, height, width, 1],因為我們不想在batch和channels上做池化,所以這兩個維度設為了1

第三個引數strides:和卷積類似,視窗在每一個維度上滑動的步長,一般也是[1, stride,stride, 1]

第四個引數padding:和卷積類似,可以取'VALID' 或者'SAME'

返回一個Tensor,型別不變,shape仍然是[batch, height, width, channels]這種形式