卷积神经网络CNN原理展示和Tensorflow相关函数介绍

卷积神经网络

1 CNN卷积层

卷积层1
卷积层2

卷积操作

卷积核Kernal与Input矩阵执行卷积操作,每次卷积的值组成了一个新的矩阵。卷积的操作是Kernal的值和每个对应的Input中的值进行乘积求和。

卷积步长

卷积步长指的是Kernal在Input中每次移动的距离是多少,该动态图中显示的是每次移动一步。

Padding

通过填充0使得卷积后的结果大小仍然和原来的矩阵大小一致。

2 CNN池化层

池化

池化层就是对原有的矩阵数据进行压缩的操作,假如是2x2的池化,那么就将子矩阵的每2x2个元素变成一个元素,如果是3x3的池化,那么就将子矩阵的每3x3个元素变成一个元素,这样输入矩阵的维度就变小了。如图所示是最大池化的操作,将2*2的矩阵中最大的元素作为新矩阵的元素,实现矩阵的维度降低。

损失函数

个人理解神经网络是通过非线性的映射将输入空间映射到输出空间。输出结果的好坏使用损失函数进行评定,损失函数衡量的是预测的结果和实际的结果之间的差距,通过利用差距使用优化算法更新神经网络中的权重进而实现降低损失函数的作用。

tensorflow函数参数详解

tf.nn.conv2d (input, filter, strides, padding, use_cudnn_on_gpu=None, data_format=None, name=None)
  • input : 输入的要做卷积的图片,要求为一个张量,shape为 [ batch, in_height, in_weight, in_channel ],其中batch为图片的数量,in_height 为图片高度,in_weight 为图片宽度,in_channel 为图片的通道数,灰度图该值为1,彩色图为3。

  • filter: 卷积核,要求也是一个张量,shape为 [ filter_height, filter_weight, in_channel, out_channels ],其中 filter_height 为卷积核高度,filter_weight 为卷积核宽度,in_channel 是图像通道数 ,和 input 的 in_channel 要保持一致,out_channel 是卷积核数量。

  • strides: 卷积时在图像每一维的步长,这是一个一维的向量,[ 1, strides, strides, 1],第一位和最后一位固定必须是1

  • padding: string类型,值为“SAME” 和 “VALID”,表示的是卷积的形式,是否考虑边界。"SAME"是考虑边界,不足的时候用0去填充周围,"VALID"则不考虑

  • use_cudnn_on_gpu: bool类型,是否使用cudnn加速,默认为true

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

参数是四个,和卷积很类似:

  • value:需要池化的输入,一般池化层接在卷积层后面,所以输入通常是feature map,依然是[batch, height, width, channels]这样的shape

  • ksize:池化窗口的大小,取一个四维向量,一般是[1, height, width, 1],因为我们不想在batch和channels上做池化,所以这两个维度设为了1

  • strides:和卷积类似,窗口在每一个维度上滑动的步长,一般也是[1, stride,stride, 1]

  • padding:和卷积类似,可以取'VALID' 或者'SAME'

返回一个Tensor,类型不变,shape仍然是[batch, height, width, channels]这种形式

总结:f(WX+b) = y CNN卷积神经网络可以认为是一种映射关系,将输入的数据X通过映射函数f获取结果y,W是映射的过程中使用的权重,在CNN网络中相当于Kernal和网络层之间连接的权重值。预测的y值与实际的y值之间有偏差,使用损失函数衡量这些偏差,为减小损失函数提高精确度,使用优化算法去调整网络中的权重W来降低损失函数。