紧接着上一节讲的卷积内容,今天我们先用tensorfloww实现一个卷积操作:
上面的图中我们可以看到,我们先用一张图片进行输入,也就是input的值,后面要给出图片的参数;filter也就是我们的滤波器(卷积核).
tf.nn.conv2d就是我们的卷积层函数,这个函数有四个参数,第一维为输入图像,第二维为卷积层权值,第三维为不同维度的步长(在CNN中,第一维、第四维固定为1),第四维填充方式(SAME表示全0填充,VALID为不填充), 层的深度:例如一个输入图像是28283,其中3代表深度,即为(R,G,B)
除了conv2d()函数之外,Tensorflow还提供了其他的用于卷积运算的函数,在这里我们不做过多的介绍,用的最多的还是conv2d()函数
池化(Pooling)
在上一节当中,我们讲述了卷积操作,通过卷积获得了特征(Feature)之后,下一步要做的工作就是利用这些特征进行分类。为了简化计算量,我们通常使用池化函数处理这一过程。池化函数会对平面内某一位置及其相邻位置的特征值进行统计汇总,并且把汇总后的结果作为这一区域内的值。常用的方法有两种,一种的最大池化(Max Pooling)和平均池化(Average Pooling),最大池化是把这一区域内的最大值作为最后的输出结果,平均池化则是选择该范围内的平均值作为输出结果。
如上图所示,上面使得44的特征图分为了四个部分,我们对每个不同颜色部分里进行池化得到了右边的值。类似于卷积函数中的卷积核,我们可以把每次执行池化操作的过程都看作是存在一个池化函数的池化核,池化核的大小就是执行池化操作的矩形区域的大小。在上面的图中,我们选取的池化核大小为2x2。最后图片被压缩成了22,从而降低了维度。
池化函数:
Tensorflow提供了几个封装好的池化函数,比如最大池化函数tf.nn.max_pool()和平均池化函数tf.nn.avg_pool(),平时应用得最多的还是最大池化函数,因为最大池化函数可以凸显一个区域内最明显的特征,以下是两种函数的代码:
Tensorflow代码:
nn.max_pool()函数的四个参数分别是:1.传入当前层的单元矩阵,也就是输入 2.池化核的尺寸,需要注意的地方是,这个尺寸虽然是一个长度为4的一维数组,但是这个数组的第一个和最后一个数字必须为1,一般都是取[1,2,2,1]和[1,3,3,1]. 3.第三个参数为步长,取法和conv2d的一样,第一维和最后一维都得是1 4.最后也就是填充了,有SAME和VALID两种,VALID表示不使用全0填充。
总结
以上就是今天的内容,在用代码回顾了昨天的卷积操作之后,我们又将了一种新的操作—池化,这两种层都是卷积神经网络中最重要的组成部分,在一个完整的卷积神经网络中,一般都是叠加多个卷积层和池化层来进行特征提取和聚合操作。