tensorflow中的卷積和池化層(一)
在官方tutorial的幫助下,我們已經使用了最簡單的CNN用於Mnist的問題,而其實在這個過程中,主要的問題在於如何設置CNN網絡,這和Caffe等框架的原理是一樣的,但是tf的設置似乎更加簡潔、方便,這其實完全類似於Caffe的python接口,但是由於框架底層的實現不一樣,tf無論是在單機還是分布式設備上的實現效率都受到一致認可。
CNN網絡中的卷積和池化層應該怎麽設置呢?tf相應的函數是什麽?具體的tutorial地址參見Tensorflow中文社區。
- 卷積(Convolution)
conv2d
: 一般卷積。函數原型:tf.nn.conv2d(input, filter, strides, padding, use_cudnn_on_gpu=None, name=None)
depthwise_conv2d
:深度卷積。tf.nn.depthwise_conv2d(input, filter, strides, padding, name=None)
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
-
avg_pool:
平均池化。函數原型:
tf.nn.avg_pool(value, ksize, strides, padding, name=None)
- max_pool:最大池化。函數原型:
tf.nn.max_pool(value, ksize, strides, padding, name=None)
- 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中的卷積和池化層(一)