卷积神经网络
0.图像基础知识
1)视频与图像
视频(Video),连续的图像变化每秒超过24帧(frame)画面以上时,看上去是平滑连续的视觉效果,这样连续的画面。
每帧都是一副图像:
灰度图,Gray Scale Image 或是Grey Scale Image,又称灰阶图,单通道(二维矩阵)。
灰度分为256阶。0-255(00000000-11111111,黑-白),电路暗点、亮点。
RGB图,即三通道(三维矩阵),由红绿蓝通道叠加为彩色图。
对图像归一化处理:data=/255,每个像素值/255,转化为易于神经网络处理的数值。
计算机视觉图像,是一种矩阵与数字信号处理。
2)Opencv与Numpy等图像处理常用包
OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉库,可以运行在Linux、Windows、Android和Mac OS操作系统上。
它轻量级而且高效——由一系列 C 函数和少量 C++ 类构成,同时提供了Python、Ruby、MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。
其他:PIL、matplotlib
python安装:pip install opencv-python
1.神经网络图像分类(以VGG16网络为例的特征提取)
0)介绍什么是卷积(convolution)、池化(pooling)、激活函数、全连接和Softmax
卷积(convolution)
卷积是在图像像素上的滑动窗口计算。有以下几个关键词:
padding,围绕图像填充一圈像素。
kernel size,卷积核大小
stride,卷积步长
下图示例其实就是卷积的过程,能够看出它的卷积核大小是3x3,步长就是卷积核的移动步数,步长为1,围绕图像填充一圈0像素,padding为1。
每次卷积出的值计算过程如下图所示:
池化(pooling)
经过卷积操作后,卷积层的参数量依旧很多,因此通过池化将输入的特征图进行压缩,一方面来说特征图得以变小减少了网络的参数量;另一方面则将主要特征提取出来。
下图是池化的操作,左边是平均值池化,右边是最大值池化。
激活(激活函数)
Sigmoid函数,tanh函数,Relu函数等等,卷积操作为线性操作,这就导致一个问题,那就是模型的表达能力不够,反向传播误差求偏导数的时候层数过深会失活。
激活函数是非线性函数,它可以为计算加入非线性因素以增加非线性表达的能力,主要分成饱和激活函数和非饱和激活函数两类。
全连接和Softmax
全连接,顾名思义就是将经历卷积以后的特征层的特征都连接起来,连接过后就可以进行统计分类了,通常情况下,在进行全连接的计算时,可以把它等效于卷积核为1x1的卷积运算。
SoftMax处理多个类别分类的问题,输出一个概率。并且,需要把每个分类的得分值换算成概率,同时解决两个分类得分值接近的问题。
SoftMax是网络的最后一层,输出识别为某类的概率。
1)卷积特征图feature map的参数计算
以VGG16为例,feature map的大小区分conv1 conv2 … 在conv1或conv2中feature map的大小是不变的,从conv1到conv2的池化操作会改变feature map大小。如下图:
实际上在卷积或池化后:
feature map size = output size
n filters = n channels = n feature map(n=64,128,256,512,1024…)
一个input image:WxH=224x224的RGB,c=3或k=3的三通道图像,经过Conv1_1feature
map的大小为224x224,通道的改变为64,即为卷积核的个数变化。
特征图大小公式,W=H=(n+2p-f)/s+1,其中:
- W、H: 图长宽
- n: 上一层特征图大小
- p: padding,图像像素填充
- f: kernel size,卷积核大小
- s:stride,卷积步长
2)VGG16网络完整模型图
3)参考学习资料
卷积神经网络基础,VGG16模型详解,全连接和Softmax
2.深度学习(训练)过程
0)综述
深度学习的过程可以分为前向传播和反向传播两个过程。这个过程中,前向传播是为了计算和目标的误差,反向传播是为了传播误差并更新每个神经元上的权重系数。
学习过程简述
目标:得到更接近你想要的输出o1,o2,即更准确地预测
过程:固定的输入x1,x2…>通过反向传播不断更新权重>得到更接近你想要的输出o1,o2…
- 利用前向传播求出误差E
- 求出误差E对权重W的偏导数
- 利用权重更新公式更新权重W,其中 α 是学习率
- 继续反向传播,更新更接近输入层的权重W,直到更新所有的权重W
- 循环1,2,3,4过程,不断更新权重W,降低误差E,最终得到训练好的神经网络(即适合的权重W)
【注意】权重W的更新是从输出层==》隐含层==》输入层,一步步更新的
1)前向传播
简单来说,前向传播过程就是数据从输入层传入,经过隐藏层,最终到达输出层的过程。如下图所示,图中包含一个输入层,一个隐藏层和一个输出层。
从左向右进行计算是一种正方向上的传播,简称为正向传播 (forward propagation)。
2)反向传播
加法的反向传播只是将上游的值传给下游,并不需要正向传播的输入信号。但是乘法的反向传播需要正向传播时的输入信号值。
因此,实现乘法节点的反向传播时,要保存正向传播的输入信号,从右向左的传播称为反向传播 (backward propagation)。
计算图的反向传播:沿着与正方向相反的方向,乘上局部导数。
反向传播的核心在于复合函数的链式求导法则,反向传播的作用在于优化代价函数,这也是训练神经网络的目标。
反向传播的计算顺序是:
将信号 E 乘以节点的局部导数 (∂ y/∂ x),然后将结果传递给下一个节点。这里所说的局部导数是指正向传播中y = f (x) 的导数,也就是 y 关于 x 的导数(∂ y/∂ x)。
如 y = f ( x ) = x^2 则局部导数为(∂ y/∂ x) = 2x。
把这个局部导数乘以 E,然后传递给前面的节点。这就是反向传播的计算顺序。
通过这样的计算,可以高效地求出导数的值,这是反向传播的要点。
3)参考学习资料
前向传播算法与反向传播算法