什么是CNN算法
卷积神经网络(Convolutional Neural Networks, CNN)是一类包含卷积计算且具备深度结构的前馈神经网络(Feedforward Neural Networks),是深度学习(deep learning)的表明算法之一。CNN最经常使用于CV领域,可是在NLP等其余领域也有应用,如用于文本分类的TextCNN。网络
下面是一个CNN的经典网络结构(LeNet):ide
CNN通常具备如下结构:函数
输入层学习
输入CNN的图片数据一般会进行如下处理之一:spa
卷积层blog
对图像(不一样的数据窗口数据)和卷积核(一组固定的权重:由于每一个神经元的多个权重固定,因此又能够看作一个恒定的滤波器 filter)作内积(逐个元素相乘再求和)的操做就是所谓的『卷积』操做,也是卷积神经网络的名字来源。图片
卷积所用到的卷积核实际上就是数字图像处理中所用到的滤波器,用于提取一组固定特征(颜色深浅、轮廓)。所不一样的是,传统的滤波器的算子是固定好的,而卷积核的权重是经过训练获得的。get
卷积核在图像上不断平滑移动,直到计算完全部卷积核大小的窗口,将输出按原顺序排列即为一个输出通道。若是输入为多通道数据,则每一个输入通道须要一个卷积核,输出通道上一个像素的值为对应位置多个卷积核的结果之和。input
卷积过程当中有以下参数:
CNN每一层输出的特征图(feature map)上的像素点在原始图像上映射的区域大小称为感觉野(Receptive Field),其计算公式为:
感觉野计算公式推导可参考:https://zhuanlan.zhihu.com/p/28492837。须要指出的是,感觉野针对的是特定的维度,好比对于输入二维图像的高和宽,各有一个感觉野。同时后面所要介绍的池化层的感觉野计算与卷积层相同。
卷积的结果须要经过非线性的激活函数如ReLU、Tanh、Sigmoid进行变换。
卷积层输出尺寸与输入尺寸的对应关系为:
设卷积层的输入尺寸为\(W*H*C\),输出尺寸为\(W'*H'*C'\),卷积核大小为\(K*K\),则计算量为:
参数量为:
达到相同感觉野时,使用小卷积核每每比使用大卷积核须要更少的参数,所以通常使用小卷积核。
池化层
池化层(pooling)也叫作下采样层,它可以对输入的特征图进行压缩,一方面使特征图变小,简化网络计算复杂度;一方面进行特征压缩,提取主要特征。
经常使用的池化操做有最大池化(max pooling)和平均池化(average pooling)。
最大池化(max pooling)
取出每一个窗口内的最大值做为输出,能够理解为进行了特征选择,选出了分类辨识度更好的特征,提供了非线性。
最大池化反向求导时把梯度直接传给前一层窗口内值最大的那一个像素,而窗口内其余像素不接受梯度,也就是为0。
平均池化(average pooling)
取出每一个窗口内的平均值做为输出,更强调对总体特征信息进行一层下采样,在减小参数维度的贡献上更大一点,更多的体如今信息的完整传递这个维度上。
平均池化反向求导时窗口内每一个像素的梯度为对应输出像素梯度的平均值。
最大池化的效果通常比平均池化更好。池化的主要做用一方面是去掉冗余信息,一方面要保留feature map的特征信息。例如在分类问题中,咱们须要知道的是这张图像有什么object,而不大关心这个object位置在哪,在这种状况下显然max pooling比average pooling更合适。在网络比较深的地方,特征已经稀疏了,从一块区域里选出最大的,比起这片区域的平均值来,更能把稀疏的特征传递下去。
全链接层
接在网络最后用于将特征映射到输出空间。
CNN的优势