百度飞桨架构师手把手带你零基础实践深度学习——打卡计划(PaddlePaddle)第二周
- 计算机视觉
- 卷积神经网络
- 卷积(Convolution)
- 池化(Pooling)
- ReLU激活函数
- 批归一化(Batch Normalization)
- 丢弃法(Dropout)
本周的主要内容是卷积神经网络——目前计算机视觉中使用最普遍的模型结构。
计算机视觉
识别图片中的物体,对人类来讲是十分简单的事情,但是,对于计算机来说就没那么简单了。由于拍摄角度等其他一系列不确定因素,人想直接对计算机编程来识别图片中的物体是非常困难的。可是我们可以将识别图片这个大任务分为几个小任务。
- (a) Image Classification: 图像分类,用于识别图像中物体的类别(如:bottle、cup、cube)。
- (b) Object Localization: 目标检测,用于检测图像中每个物体的类别,并准确标出它们的位置。
- © Semantic Segmentation: 图像语义分割,用于标出图像中每个像素点所属的类别,属于同一类别的像素点用一个颜色标识。
- (d) Instance Segmentation: 实例分割,值得注意的是,(b)中的目标检测任务只需要标注出物体位置,而(d)中的实例分割任务不仅要标注出物体位置,还需要标注出物体的外形轮廓。
卷积神经网络
图片不同于其他类型的数据,其位置信息是十分重要的。卷积神经网络进行特征提取,既能提取到相邻像素点之间的特征模式,又能保证参数的个数不随图片尺寸变化。
卷积神经网络基础模块
- 卷积(Convolution)
- 池化(Pooling)
- ReLU激活函数
- 批归一化(Batch Normalization)
- 丢弃法(Dropout)
典型的卷积神经网络结构,多层卷积和池化层组合作用在输入图片上,在网络的最后通常会加入一系列全连接层,ReLU激活函数一般加在卷积或者全连接层的输出上,网络中通常还会加入Dropout来防止过拟合。
卷积(Convolution)
飞桨卷积算子对应的API是paddle.fluid.dygraph.Conv2D,用户可以直接调用API进行计算,也可以在此基础上修改。常用的参数如下:
- num_channels (int) – 输入图像的通道数。
- num_fliters (int) – 卷积核的个数,和输出特征图通道数相同。
- filter_size(int|tuple) – 卷积核大小,可以是整数,比如3,表示卷积核的高和宽均为3 ;或者是两个整数的list,例如[3,2],表示卷积核的高为3,宽为2。
- stride(int|tuple) – 步幅,可以是整数,默认值为1,表示垂直和水平滑动步幅均为1;或者是两个整数的list,例如[3,2],表示垂直滑动步幅为3,水平滑动步幅为2。
- padding(int|tuple) – 填充大小,可以是整数,比如1,表示竖直和水平边界填充大小均为1;或者是两个整数的list,例如[2,1],表示竖直边界填充大小为2,水平边界填充大小为1。
- act(str)- 应用于输出上的激活函数,如Tanh、Softmax、Sigmoid,Relu等,默认值为None。
池化(Pooling)
池化是使用某一位置的相邻输出的总体统计特征代替网络在该位置的输出。
好处:
- 当输入数据做出少量平移时,经过池化函数后的大多数输出还能保持不变。
- 由于池化之后特征图会变得更小,如果后面连接的是全连接层,能有效的减小神经元的个数,节省存储空间并提高计算效率。
池化通常有两种方法,平均池化和最大池化。
ReLU激活函数
ReLU函数与Sigmoid函数相比,虽然在x<0的地方,ReLU函数的导数为0。但是在x≥0的地方,ReLU函数的导数为1,能够将y的梯度完整的传递给x,而不会引起梯度消失。
批归一化(Batch Normalization)
为了算法的稳定和收敛,我们通常会对神经网络的数据进行标准化处理,使得样本数据集满足均值为0,方差为1的统计分布。但是对于参数不断更新的深度神经网络来说,这是不够的,比较靠后的那些层,其接收到的输入仍然是剧烈变化的,通常会导致数值不稳定,模型很难收敛。BatchNorm能够使神经网络中间层的输出变得更加稳定,并有如下三个优点:
- 使学习快速进行(能够使用较大的学习率)
- 降低模型对初始值的敏感性
- 从一定程度上抑制过拟合
BatchNorm主要思路是在训练时按mini-batch为单位,对神经元的数值进行归一化,使数据的分布满足均值为0,方差为1。
丢弃法(Dropout)
丢弃法就是在神经网络学习过程中,随机删除一部分神经元。训练时,随机选出一部分神经元,将其输出设置为0,这些神经元将不对外传递信号。其在一定程度上能抑制过拟合。但是训练时由于部分神经元被随机丢弃了,输出数据的总大小会变小,预测时却没有丢弃神经元,这将导致训练和预测时数据的分布不一样。
解决办法:
- downgrade_in_infer
训练时以比例rrr随机丢弃一部分神经元,不向后传递它们的信号;预测时向后传递所有神经元的信号,但是将每个神经元上的数值乘以 (1−r)。 - upscale_in_train
训练时以比例r随机丢弃一部分神经元,不向后传递它们的信号,但是将那些被保留的神经元上的数值除以 (1−r);预测时向后传递所有神经元的信号,不做任何处理。