目录
前言
本文记录梅科尔工作室深度学习培训的第五讲CNN算法的学习笔记,感谢泓利哥的讲解!
参考文章链接:CNN笔记:通俗理解卷积神经网络_v_JULY_v的博客-CSDN博客_cnn卷积神经网络
1.计算机视觉
计算机视觉的应用领域如下图所示
1.1. 计算机视觉分类
(a) lmage Classification:
图像分类,用于识别图像中物体的类别(如: bottle、cup、cube)
(b) Object Localization:
目标检测,用于检测图像中每个物体的类别,并准确标出它们的位置
(c) Semantic Segmentation:
图像语义分割,用于标出图像中每个像素点所属的类别,属于同一类别的像素点用一个颜色标识
(d) Instance Segmentation:
实例分割,值得注意的是。(b)中的目标检测任务只需要标注出物体位置,而(d)中的实例分割任务不仅要标注出物体位置,还需要标注出物体的外形轮廓
2. CNN
CNN的两大特点:
- 能够有效的将大数据量的图片降维成小数据量
- 能够有效的保留图片特征,符合图片处理的原则
CNN解决的两大问题:
- 图像需要处理的数据量太大,导致成本很高,效率很低
- 图像在数字化的过程中很难保留原有的特征,导致图像处理的准确率不高
CNN层级结构如图所示
最左边是数据输入层,对数据做一些处理,比如去均值(把输入数据各个维度都中心化为0,避免数据过多偏差,影响训练效果)、归一化(把所有的数据都归一到同样的范围)、PCA/白化等等。CNN只对训练集做“去均值”这一步。
CONV:卷积计算层,线性乘积 求和。
RELU:激励层,ReLU是激活函数的一种。
POOL:池化层,简言之,即取区域平均或最大。
FC:全连接层
3. 卷积层
3.1. 什么是卷积
对图像(不同的数据窗口数据)和滤波矩阵(一组固定的权重:因为每个神经元的多个权重固定,所以又可以看做一个恒定的滤波器filter)做内积(逐个元素相乘再求和)的操作就是所谓的『卷积』操作,也是卷积神经网络的名字来源。
非严格意义上来讲,下图中红框框起来的部分便可以理解为一个滤波器,即带着一组固定权重的神经元。多个滤波器叠加便成了卷积层。
比如下图中,图中左边部分是原始输入数据,图中中间部分是滤波器filter,图中右边是输出的新的二维数据。(对应相乘再相加)
中间滤波器filter与数据窗口做内积,其具体计算过程则是:4*0 + 0*0 + 0*0 + 0*0 + 0*1 + 0*1 + 0*0 + 0*1 + -4*2 = -8
3.2. 动态卷积操作
在CNN中,滤波器filter(带着一组固定权重的神经元)对局部输入数据进行卷积计算。每计算完一个数据窗口内的局部数据后,数据窗口不断平移滑动,直到计算完所有数据。这个过程中,有这么几个参数:
a. 深度depth:神经元个数,决定输出的depth厚度。同时代表滤波器个数。
b. 步长stride:决定滑动多少步可以到边缘。
c. 填充值zero-padding:在外围边缘补充若干圈0,避免边缘值浪费
动态演示如下:
如上图所示,可以分析出这个卷积操作中有
- 两个神经元,即depth=2,意味着有两个滤波器。
- 数据窗口每次移动两个步长取3*3的局部数据,即stride=2。
- zero-padding=1。
4. 池化层
池化(Pooling),有的地方也称汇聚,实际是一个下采样(Down-sample)过程,用来缩小高、长方向的尺寸,减小模型规模,提高运算速度,同时提高所提取特征的鲁棒性。简单来说,就是为了提取一定区域的主要特征,并减少参数数量,防止模型过拟合。
池化层通常出现在卷积层之后,二者相互交替出现,并且每个卷积层都与一个池化层一一对应。
常用的池化函数有:平均池化(Average Pooling / Mean Pooling)、最大池化(Max Pooling)、最小池化(Min Pooling)和随机池化(Stochastic Pooling)等,其中3种池化方式展示如下。
实例解析:
上图所展示的是取区域最大,即上图左边部分中 左上角2x2的矩阵中6最大,右上角2x2的矩阵中8最大,左下角2x2的矩阵中3最大,右下角2x2的矩阵中4最大,所以得到上图右边部分的结果:6 8 3 4。
5.激活函数的作用
常用的非线性激活函数有sigmoid、tanh、relu等等,前两者sigmoid/tanh比较常见于全连接层,后者relu常见于卷积层。这里先简要介绍下最基础的sigmoid函数。
sigmoid的函数表达式如下
其中z是一个线性组合,比如z可以等于:b + * + *。通过代入很大的正数或很小的负数到g(z)函数中可知,其结果趋近于0或1。
因此,sigmoid函数g(z)的图形表示如下( 横轴表示定义域z,纵轴表示值域g(z) ):
也就是说,sigmoid函数的功能是相当于把一个实数压缩至0到1之间。当z是非常大的正数时,g(z)会趋近于1,而z是非常小的负数时,则g(z)会趋近于0。
压缩至0到1有何用处呢?用处是这样一来便可以把激活函数看作一种“分类的概率”,比如激活函数的输出为0.9的话便可以解释为90%的概率为正样本。
举个例子,如下图(图引自Stanford机器学习公开课)
但是实际梯度下降中,sigmoid容易饱和、造成终止梯度传递,且没有0中心化,可以尝试ReLU激活函数。
ReLU激活函数
ReLU的优点是收敛快,求梯度简单
总结
这次学习笔记到此结束,多是参考大佬的文章讲解,此文章属于入门级,这也是对于CNN的初步学习与理解,还需要更加深入的学习才能够收获更多。