AI智能
改变未来

百度飞桨PaddlePaddle-21天零基础实践深度学习-卷积神经网络基础

百度飞桨PaddlePaddle-21天零基础实践深度学习-卷积神经网络基础

  • 计算机视觉
  • 主要任务
  • 应用场景
  • 发展历程
  • 卷积神经网络
    • 卷积
    • 卷积计算
    • 填充(padding)
    • 步幅(stride)
    • 感受野(Receptive Field)
    • 多输入通道、多输出通道和批量操作
  • 池化
  • 激活函数
  • 批归一化(BatchNorm)
  • Dropout
  • 计算机视觉

    主要任务

    识别图片物体
    检测物体所在的位置
    目标物体跟踪
    理解并描述图像里场景和故事

    基本子任务:
    <1> 图像分类 (类别)
    <2> 目标检测 (类别 + 位置)
    <3> 图像语义分割 (类别 + 同类物体用同一颜色标识)
    <4> 实例分割 (类别 + 位置 + 轮廓)

    应用场景

    停车场出入口的车牌识别一 目标检测+文字识别
    小区安防监控一行为识别
    道路交通违章抓拍—行为识别
    写字楼入口处的人脸闸机一人脸识别
    手机上的刷脸支付一人脸识别
    自动票据识别一文字识别
    工业产品缺陷检测一目标检测、 图像分割
    医疗影像检测一目标检测、 图像分割


    飞桨为计算机视觉任务提供了丰富的API,并通过底层优化和加速保证API的性能。同时,飞桨还提供了丰富的模型库,覆盖图像分类、检测、分割、文字识别和视频理解等多个领域。

    发展历程

    <早期> 全局的视觉底层特性统计量表示图像 (特征向量:颜色、形状、纹理…)

    <中期> 局部特征转化为视觉关键词,图片表示为视觉词袋 (局部检测算子、局部描述算子)

    <传统方法> 人工特征提取+分类器 (专家经验+耗时长)

    <深度学习> 原始信号——低级抽象——高级抽象迭代

    <后来> 大数据的涌现 + 硬件性能提升 → 计算机视觉的丰富发展

    卷积神经网络

    卷积神经网络(CNN)是计算机视觉技术最经典的模型结构。接下来主要介绍卷积神经网络的常用模块,包括:卷积、池化、激活函数、批归一化、Dropout等。

    手写数字识别任务,全连接层的特征提取,即将一张图片上的所有像素点展开成一个1维向量输入网络,存在问题

    1. 输入数据的空间信息被丢失

    2. 模型参数过多,容易发生过拟合。

    为了解决上述问题,我们引入卷积神经网络进行特征提取,既能提取到相邻像素点之间的特征模式,又能保证参数的个数不随图片尺寸变化。

    卷积

    卷积计算

    互相关运算作为卷积的定义
    卷积核(kernel)也被叫做滤波器(filter),假设卷积核的高和宽分别为khk_{h}kh​和kwk_{w}kw​,则称为kh×kwk_{h}\\times k_{w}kh​×kw​卷积。

    卷积核的计算过程可以用下面的数学公式表示,其中 a 代表输入图片, b 代表输出特征图,w 是卷积核参数,它们都是二维数组,∑u,v\\sum u,v∑u,v 表示对卷积核参数进行遍历并求和。b[i,j]=∑u,va[i+u,j+v]⋅w[u,v]b[i,j]=\\sum_{u,v}a[i+u,j+v]\\cdot w[u,v]b[i,j]=u,v∑​a[i+u,j+v]⋅w[u,v]
    卷积计算过程:

    填充(padding)

    卷积输出特征图的尺寸计算方法
    Hout=H−kh+1H_{out}=H-k_{h}+1Hout​=H−kh​+1Wout=W−kw+1W_{out}=W-k_{w}+1Wout​=W−kw​+1

    当卷积核尺寸大于1时,输出特征图的尺寸会小于输入图片尺寸。说明经过多次卷积之后尺寸会不断减小。为了避免卷积之后图片尺寸变小,通常会在图片的外围进行填充(padding)。

    在卷积计算过程中,通常会在高度或者宽度的两侧采取等量填充
    Hout=H+2ph−kh+1H_{out}=H+2p_{h}-k_{h}+1Hout​=H+2ph​−kh​+1Wout=W+2ph−kw+1W_{out}=W+2p_{h}-k_{w}+1Wout​=W+2ph​−kw​+1

    卷积核大小通常使用1,3,5,7这样的奇数,如果使用的填充大小为ph=(kh−1)/2p_{h}=(k_{h}-1)/2ph​=(kh​−1)/2 , pw=(kh−1)/2p_{w}=(k_{h}-1)/2pw​=(kh​−1)/2,则卷积之后图像尺寸不变。

    步幅(stride)

    步幅为mmm的卷积过程,卷积核在图片上移动时,每次移动大小为mmm个像素点。

    当宽和高方向的步幅分别为shs_{h}sh​和sws_{w}sw​ 时,输出特征图尺寸的计算公式:
    Hout=H+2ph−khsh+1H_{out}=\\frac{H+2p_{h}-k_{h}}{s_{h}}+1Hout​=sh​H+2ph​−kh​​+1Wout=W+2pw−kwsw+1W_{out}=\\frac{W+2p_{w}-k_{w}}{s_{w}}+1Wout​=sw​W+2pw​−kw​​+1

    感受野(Receptive Field)

    输出特征图上每个点的数值,是由输入图片上大小为kh×kw​k_{h}\\times k_{w}​kh​×kw​​的区域的元素与卷积核每个元素相乘再相加得到的,所以输入图像上kh×kw​k_{h}\\times k_{w}​kh​×kw​​ 区域内每个元素数值的改变,都会影响输出点的像素值。我们将这个区域叫做输出特征图上对应点的感受野。感受野内每个元素数值的变动,都会影响输出点的数值变化。

    多输入通道、多输出通道和批量操作

    多输入通道场景

    一张图片往往含有RGB三个通道,假设输入图片的通道数为CinC_{in}Cin​,输入数据的形状是Cin×Hin×WinC_{in}\\times H_{in}\\times W_{in}Cin​×Hin​×Win​。
    多输入通道计算过程:

    1.对每个通道分别设计一个2维数组作为卷积核,卷积核数组的形状是Cin×kh×kwC_{in}\\times k_{h}\\times k_{w}Cin​×kh​×kw​
    2.对任一通道cin∈[0,Cin)c_{in}∈[0,C_{in})cin​∈[0,Cin​) ,分别用大小为kh×kwk_{h}\\times k_{w}kh​×kw​ 的卷积核在大小为Hin×WinH_{in}\\times W_{in}Hin​×Win​的二维数组上做卷积
    3.将这CinC_{in}Cin​个通道的计算结果相加,得到的是一个形状为Hout×WoutH_{out}×W_{out}Hout​×Wout​ 的二维数组

    多输出通道场景

    一般来说,卷积操作的输出特征图也会具有多个通道CoutC_{out}Cout​,这时需要设计CoutC_{out}Cout​个维度为 Cin×kh×kwC_{in}\\times k_{h}\\times k_{w}Cin​×kh​×kw​的卷积核,卷积核数组的维度是Cout×Cin×kh×kwC_{out}\\times C_{in}\\times k_{h}\\times k_{w}Cout​×Cin​×kh​×kw​
    多输出通道计算过程:

    1.对任一通道cout∈[0,Cout)c_{out}∈[0,C_{out})cout​∈[0,Cout​) ,分别使用上面描述的形状为Cin×kh×kwC_{in}\\times k_{h}\\times k_{w}Cin​×kh​×kw​ 的卷积核对输入图片做卷积。
    2.将这CoutC_{out}Cout​个形状为Hout×WoutH_{out}\\times W_{out}Hout​×Wout​的二维数组拼接在一起,形成维度为Cout×Hout×WoutC_{out}×H_{out}×W_{out}Cout​×Hout​×Wout​

    批量操作

    在卷积神经网络的计算中,通常将多个样本放在一起形成一个mini-batch进行批量操作,即输入数据的维度是N×Cin×Hin×WinN\\times C_{in} \\times H_{in} \\times W_{in}N×Cin​×Hin​×Win​。
    批量操作计算过程:

    由于会对每张图片使用同样的卷积核进行卷积操作,卷积核的维度与上面多输出通道的情况一样,仍然是 输出特征图的维度是Cout×Cin×kh×kwC_{out}×C_{in}×k_{h}×k_{w}Cout​×Cin​×kh​×kw​,输出特征图的维度是N×Cout×Hout×WoutN\\times C_{out}\\times H_{out}\\times W_{out}N×Cout​×Hout​×Wout​

    池化

    平均池化 : 池化窗口覆盖区域内的像素取平均值,得到相应的输出特征图的像素值。

    最大池化 : 对池化窗口覆盖区域内的像素取最大值,得到输出特征图的像素值。

    在卷积神经网络中,通常使用2×22×22×2大小的池化窗口,步幅也使用2,填充为0,则输出特征图的尺寸为:
    Hout=H2H_{out}=\\frac {H}{2}Hout​=2H​Wout=W2W_{out}=\\frac {W}{2}Wout​=2W​
    通过这种方式的池化,输出特征图的高和宽都减半,但通道数不会改变。

    激活函数

    Sigmoid激活函数
    y=11+e−xy=\\frac {1}{1+e^{-x}}y=1+e−x1​
    Sigmoid函数在反向传播过程中,容易造成梯度的衰减。
    如果有多层网络使用了Sigmoid激活函数,则比较靠后的那些层梯度将衰减到非常小的值,导致梯度消失

    ReLU激活函数

    y={0x<0xx⩾0y=\\left\\{\\begin{matrix}0 &x<0 \\\\x & x\\geqslant 0\\end{matrix}\\right.y={0x​x<0x⩾0​
    目前用的较多的激活函数是ReLU

    批归一化(BatchNorm)

    目的 : 对神经网络中间层的输出进行标准化处理,使得中间层的输出更加稳定。

    优点:
    使学习快速进行(能够使用较大的学习率)
    降低模型对初始值的敏感性
    从一定程度上抑制过拟合

    主要思路:在训练时按mini-batch为单位,对神经元的数值进行归一化,使数据的分布满足均值为0,方差为1

    计算过程
    1.计算mini-batch内样本的均值
    μB←1m∑i=1mx(i)\\mu _{B}\\leftarrow\\frac{1}{m}\\sum_{i=1}^{m}x^{(i)}μB​←m1​i=1∑m​x(i)
    2.计算mini-batch内样本的方差
    σB2←1m∑i=1m(x(i)−μB)2\\sigma _{B}^{2}\\leftarrow \\frac{1}{m}\\sum_{i=1}^{m}(x^{(i)-\\mu _{B}})^{2}σB2​←m1​i=1∑m​(x(i)−μB​)2
    3. 计算标准化之后的输出
    x^(i)←x(i)−uB(σB2+ϵ)\\hat{x}^{(i)}\\leftarrow \\frac{x^{(i)}-u_{B}}{\\sqrt{(\\sigma _{B}^{2}+\\epsilon )}}x^(i)←(σB2​+ϵ)​x(i)−uB​​
    在BatchNorm的具体实现中,训练时会计算均值和方差的移动平均值。在飞桨中,默认计算:

    Dropout

    深度学习中一种常用的抑制过拟合的方法,其做法是在神经网络学习过程中,随机删除一部分神经元。通常Dropout=0.5

    downgrade_in_infer

    训练时以比例rrr随机丢弃一部分神经元,不向后传递它们的信号;预测时向后传递所有神经元的信号,但是将每个神经元上的数值乘以 (1−r)(1−r)(1−r)。

    upscale_in_train

    训练时以比例rrr随机丢弃一部分神经元,不向后传递它们的信号,但是将那些被保留的神经元上的数值除以 (1−r)(1−r)(1−r);预测时向后传递所有神经元的信号,不做任何处理。

    赞(0) 打赏
    未经允许不得转载:爱站程序员基地 » 百度飞桨PaddlePaddle-21天零基础实践深度学习-卷积神经网络基础