1. 程式人生 > >tensorflow中的卷積和池化層(一)

tensorflow中的卷積和池化層(一)

oat avg 滑動 shape 要求 網絡 vol 加速 ali

在官方tutorial的幫助下,我們已經使用了最簡單的CNN用於Mnist的問題,而其實在這個過程中,主要的問題在於如何設置CNN網絡,這和Caffe等框架的原理是一樣的,但是tf的設置似乎更加簡潔、方便,這其實完全類似於Caffe的python接口,但是由於框架底層的實現不一樣,tf無論是在單機還是分布式設備上的實現效率都受到一致認可。

CNN網絡中的卷積和池化層應該怎麽設置呢?tf相應的函數是什麽?具體的tutorial地址參見Tensorflow中文社區。

  • 卷積(Convolution)
  1. conv2d: 一般卷積。函數原型:

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

  2. depthwise_conv2d:深度卷積。

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

  3. separable_conv2d: 深度可分離卷積。

    tf.nn.separable_conv2d(input, depthwise_filter, pointwise_filter, strides, padding, name=None)

上篇關於Mnist,我們使用的是conv2d,下面介紹一下這個函數。

第一個參數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,×,×,1],表示只在輸入圖中做卷積,而跟channel和batch無關,通常×是相同的。

第四個參數padding:string類型的量,只能是”SAME”,”VALID”其中之一,這個值決定了不同的卷積方式,“SAME”表示有padding的卷積,尤其在stride=[1,1,1,1]的情況下,輸入和輸出的tensor維度一樣,這也正是在Mnist中采用的,這種也稱為HALF padding,因為p=[k/2],向下取整。而“VALID”表示無padding,不在原始輸入上加任何padding,直接卷積。

第五個參數use_cudnn_on_gpu:bool類型,是否使用cudnn加速,默認為true。

卷積的結果就是返回一個Tensor,這個輸出,就是我們常說的feature map,feature map的維度取決於卷積和池化層,這和Caffe是類似的,那就是[batch,高度,寬度,通道數=卷積核個數]。

  • 池化Pooling
  1. avg_pool:平均池化。函數原型:

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

  2. max_pool:最大池化。函數原型:

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

  3. max_pool_with_argmax:計算池化區域中元素的最大值和該最大值所在的位置。函數原型:

    tf.nn.max_pool_with_argmax(input, ksize, strides, padding, Targmax=None, name=None)

Mnist中使用的是max_pool方式,其和卷積類似。

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

第二個參數ksize:池化窗口的大小,取一個四維向量,一般是[1, height, width, 1],同理不在batch和channels上做池化,所以這兩個維度設為了1,通常height=width。

第三個參數strides:和卷積類似,窗口在每一個維度上滑動的步長,一般也是[1, stride,stride, 1],步長為2,即為減半。

第四個參數padding:和卷積類似,可以取’VALID’ 或者’SAME’。

返回一個Tensor,類型不變,仍是feature map。其shape也是[batch, height, width, channels]這種形式。

tensorflow中的卷積和池化層(一)