卷積層
卷積神經網絡和全連接的深度神經網絡不同的就是卷積層,從網絡結構來說,卷積層節點和全連接層節點有三點主要的不同,一是局部感知域,二是權值共享,三是多核卷積。
①局部感知域是指,對於每一個計算單元來說,只需要考慮其像素位置附近的輸入,並不需要與上一層的節點相連,這可以大大減小網絡的參數。
②另一項減少參數的方式是權值共享,比如在對一張圖片進行卷積的時候,會讓卷積核逐一滑過圖片的每個像素,也就是說,處理每一個像素的參數都相同。
③每一個卷積核是一個特征提取器,若是只有一個卷積核的話,就只能提取一種特征,顯然不夠,所以使用多個卷積核,提取多個特征,以多核卷積的方式保證充分提取特征。
每個卷積核都會生成一幅新的圖像,在卷積神經網絡中,生成的圖像叫做特征圖(feature maps),可以理解為圖片經過濾波后的不同通道(channels)。
TensorFlow中tf.nn.conv2d用於在計算圖中加入2D卷積算子,其輸入必須是4維張量,第一位是batch,后面分別為in_height,in_width,in_channels;參數filter是指定的卷積核,比如filter=[3, 3, 3, 32]表示卷積核大小為3×3,輸入圖像通道是3通道,輸出32通道,即有32個卷積核;參數strides指定了卷積核的滑動步長;padding指定了邊緣處理方式。參數取值詳見help(tf.nn.conv2d)。
池化層
經過了卷積層提取特征以后,得到的特征圖代表了比像素更高級的特征,但是每一組卷積核都生成一幅與原圖像素相同大小的特征圖,並且為了提取多特征,使得通道數比之前還要多,發生了升維,而池化操作就是為了降維。
池化是將圖像按窗口大小划分成不重疊的區域,然后對一個區域內的元素進行聚合。一般采用2×2大小的窗口,聚合的方法有兩種,最大池化(取最大值,max pooling)和平均池化(取平均值,average pooling),對於2×2的池化操作,處理完圖像長和寬都是原圖的一半。實現代碼如下:
import tensorflow as tf
# 輸入圖像為256×256,RGB三通道
x = tf.placeholder(tf.float32, shape=[None, 256, 256, 3])
conv = tf.nn.conv2d(x, filter=[3, 3, 3, 32], strides=[1, 2, 2, 1], padding='SAME') pool = tf.nn.max_pool(conv, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding='SAME')
