CNNs中的卷积层和池化层

 卷积层

    卷积神经网络和全连接的深度神经网络不同的就是卷积层,从网络结构来说,卷积层节点和全连接层节点有三点主要的不同,一是局部感知域,二是权值共享,三是多核卷积。

①局部感知域是指,对于每一个计算单元来说,只需要考虑其像素位置附近的输入,并不需要与上一层的节点相连,这可以大大减小网络的参数。

②另一项减少参数的方式是权值共享,比如在对一张图片进行卷积的时候,会让卷积核逐一滑过图片的每个像素,也就是说,处理每一个像素的参数都相同。

③每一个卷积核是一个特征提取器,若是只有一个卷积核的话,就只能提取一种特征,显然不够,所以使用多个卷积核,提取多个特征,以多核卷积的方式保证充分提取特征。

    每个卷积核都会生成一幅新的图像,在卷积神经网络中,生成的图像叫做特征图(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')
posted @ 2018-08-07 15:48  月河雪飞  阅读(1163)  评论(0编辑  收藏  举报