卷积神经网络入门
深度学习
深度学习与机器学习的关系
- 深度学习是机器学习的子类型。
- 使用机器学习,手动提取图像的相关特征。
- 使用深度学习,将原始图像直接馈送给深度神经网络,该网络自动学习特征。
卷积神经网络
卷积神经网络(CNN 或 ConvNet)是图像和视频深度学习的最流行算法之一
CNN网络架构(一般包括)
输入层– 卷积层 – 池化层 …(n个卷积&池化层)… 全连接层 – 输出层
输入层 (InputLayer)
图像输入层将图像输入到网络并应用数据归一化
- 数据预处理
- 数据预处理的原因
输入数据单位不一样,可能会导致神经网络收敛速度慢,训练时间长。
神经网络中存在的激活函数是有值域限制的,需要将网络训练的目标数据映射到激活函数的值域。
- 数据预处理方式
- 数据标准化:将数据按比例缩放,使之落入一个小的特定区间。
- 归一化:每个像素の新数据 = [(原数据 – 均值)/ 标准差 ] + 偏执
- 去均值:将输入数据的各个维度中心化到 0
- PCA/白化:前者降维。后者对数据的每个特征上的幅度归一化
-
数据增强:增加训练数据,则能够提升算法的准确率,因为这样可以避免过拟合。当训练数据有限的时候,可以通过一些变换来从已有的训练数据集中生成一些新的数据,来扩大训练数据。
[========]
卷积层 (ConvolutionLayer)
经过输入层的不同格式图像进入卷积层,将输入图像放进一组卷积过滤器,每个过滤器激活图像中的某些特征。
-
滤波器和步幅
卷积层由连接到输入图像的子区域或连接到前一层的输出的神经元组成。该层在扫描图像的同时学习由这些区域所局部化的特征。对于输入图像的每个区域,滤波器对输入进行卷积。
下图显示一个扫描输入的 3×3 滤波器。下部子图表示输入,上部子图表示输出。
滤波器移动的步长大小称为步幅。
下图显示一个扫描输入的 3×3 滤波器,步幅为 2。下部子图表示输入,上部子图表示输出。
滤波器中的权重数为 h* w * c,其中 h 是高度,w 是滤波器的宽度,c 是输入中的通道数。例如,如果输入是彩色图像,则颜色通道的数量是 3。 -
零填充:
向图像输入边框添加由零组成的行或列。通过调整零填充,您可以控制层的输出大小。
下图显示一个用于扫描输入的 3×3 滤波器,其零填充大小为 1。下部子图表示输入,上部子图表示输出。
-
特征图
当滤波器扫描输入时,它对卷积使用相同的权重和偏置,从而形成特征图。每个特征图均为使用不同权重集和不同偏置的卷积结果。因此,特征图的数量等于滤波器的数量。卷积层中的参数总数为 ((hwc + 1)*Number of Filters),其中 1 为偏置。 -
输出大小
卷积层的输出高度和宽度为 (Input Size – ((Filter Size – 1)*Dilation Factor + 1) + 2 *Padding)/Stride + 1。此值必须为整数,才能完全覆盖整个图像。如果这些选项的组合无法完全覆盖图像,则默认情况下,软件会忽略卷积中沿图像右边缘和下边缘的其余部分。 -
神经元数量
输出高度和宽度的乘积是特征图中神经元的总数,即 Map Size。卷积层中的神经元总数(输出大小)是 Map Size*Number of Filters。
例如,假设输入图像是一个 32×32×3 彩色图像。对于具有 8 个滤波器且滤波器大小为 5×5 的卷积层,每个滤波器的权重数是 5 * 5 * 3 = 75,并且该层中的参数总数是 (75 + 1) * 8 = 608。如果每个方向的步幅为 2,并且指定的填充大小为 2,则每个特征图为 16×16。这是因为 (32 – 5 + 2 * 2)/2 + 1 = 16.5,图像右侧和底部一些最外层的零填充被丢弃。最后,该层中神经元的总数是 16 * 16 * 8 = 2048。
通常经过卷积处理后,来自这些神经元的结果会进行归一化处理,并以某种非线性(例如修正线性单元 (ReLU))形式进行传递。
归一化处理
- 为了加快卷积神经网络的训练并降低对网络初始化的敏感度,在卷积层和非线性部分之间使用批量归一化。
- 批量归一化对神经网络中的激活值和梯度传播进行归一化,使网络训练成为更简单的优化问题。为了充分利用这一点,可以尝试提高学习率。
- 由于优化问题更容易,参数更新可以更大,网络学习的速度更快。也可以尝试减少 L2 和丢弃正则化。
非线性激活函数
模拟人类真实的神经元的传递规则,限制每层之间的输出值范围,为神经网络引入非线性的能力,激活函数的功能就像是控制神经元活跃度的控制伐, 决定向下一个神经元的连接情况。
若没有每层之间的非线性激活函数,所有隐藏层都失去了原始的作用,多层线性操作也等价于一层线性操作。
– 激活函数应该具有的特征
• 避免梯度消失的特性,造成网络更新过慢
• 输出最好关于0对称,这样就不会造成梯度向特定方向移动
• 激活函数应该为神经网络引入非线性
• 激活函数应该是可微的,使得满足各层之间梯度下降的计算(至少部分可微)
• 梯度的计算不应该太复杂,影响网络性能
常见的激活函数
Sigmod函数、Tanh函数、ReLU、Leaky ReLU(图像顺序)
常见的激活函数的应用场景及特点见链接:神经网络为什么需要非线性(激活函数)
Sigmod函数:
未完待续……