[Paddlepaddle]CV学习笔记:卷积神经网络

2020.5.20笔记整理


卷积

卷积核就是一个二维矩阵,通过在原始图片上滑动同时与原图对应位置元素相乘再相加的操作,求得输出图片,因此显然卷积操作保留了原图的空间信息,卷积和的参数个数与输入图片大小无关(只用全连接的缺点)

卷积核一般选择奇数矩阵,例如1 x 1,3 x 3

卷积算子还要加上偏置项(用于改变偏置大小)

设输入图片大小为H x W,卷积核大小为kh x kw
∴原始输出图片大小为

Hout = H-kh+1
Wout = W-kw+1

为了让输出图片大小与原图大小相同,需要进行图片填充操作,一般采取等量填充一次填充填充2(前后各1)

Hout = H+2ph-kh+1
Wout = W+2pw-kw+1

步幅——卷积核一次滑动距离
卷积核在图片上的移动次数与步幅相关,步幅s越大,移动次数越小
步幅不为1时,输出图片会变小(显然)

Hout = ((H+2ph-kh)/sh) +1
Wout = ((W+2pw-kw)/sw) +1

输入图片一般包含多个通道,例如RGB三色通道,因此需要卷积核与输入图片在参数再加一维,扩充为三维,[C,H,W],第一维C表示是在哪一个通道,计算时对每个通道分别计算,最后对应位置元素加和,但是为了让输入输出信息不丢失(上述输出为二维,丢失了通道数的信息),所以应再给卷积核加上一维变成[co,ci,kh,kw],扩为四维,新增的第一维co代表输出通道数

输出通道的数目通常也称作卷积核个数

卷积操作还要加上偏置项,每一个通道偏置参数不同,偏置参数的个数应与输出通道数相等

批量处理多张图片
输入图片参数扩维,加一维N,代表处理的哪一张图片

感受野是指输出图片上一个像素所对应输入图片上的像素范围,感受野内任意元素改变,输出图片对应元素发生改变
输出特征图上的像素点所能感受到的输入数据的范围的大小就是感受野的大小
单层卷积中,卷积核大小为与感受野大小相同
多层卷积中,则需要逐层计算,多次卷积操作之后的输出特征图感受野更大,提取的特征也更加全局,因此一般卷积神经网络中都会采取多次卷积

卷积核是需要设计的,一般模型中的卷积核都是专门设计好的


Paddle API(部分)
paddle.fluid.dygraph.nn.Conv2D(二维卷积)
name_scope,卷积层名
num_filter,输出通道数目
filter_size,卷积核大小,可以整数定义同高同宽,也可以2个整数list自定
stride,步幅,整数或2个整数list
padding,填充大小,整数或2个整数list
act,激活函数,卷积完成后使用激活函数作用在神经元上

查看卷积层参数
conv.parameters()
权重参数conv/Conv2D_0.w_0
偏置参数conv/Conv2D_0.b_0


卷积的简单应用
①边缘检测(黑白,彩色)
②均值模糊


池化

使用某一位置上的总体统计特征来代替网络在该位置上的输出(选一个代表代表某一区域)
方式:平均池化,最大池化

当输入数据做出少量平移改变时,经过池化函数后,可以帮助输入的表示近似不变

也可以不需要知道某种特征的具体位置,可以通过约化某一片区域的像素点来得到总体统计特征

经过池化之后,特征图会变得更小,如果后面连接全连接层,能够有效降低神经元个数,节省空间提高计算效率

池化相关参数
pool_size,池化窗口大小[kh,kw]
pool_stride,池化窗口滑动步幅[sh,sw]
padding,图片填充操作[ph,pw]

比较常见参数配置:
kh=kw=2; sh=sw=2; ph=pw=0
这样配置可以让输出图片高和宽都减半

池化没有学习参数,池化通道数不变,每个通道单独池化,且对微小位置变化时使输出特征图具有鲁棒性


激活函数

卷积和全连接都是线性操作,无法进行异或这样的非线性操作,因此通常在此之后加上一个非线性函数,作用在每一个神经元的输出上,从而实现非线性变换的效果吗

Sigmoid函数
y = 1 1 + e x y = \frac 1{1+e^{-x}}

ReLU函数
y = {   0 ( x < 0 )   x ( x 0 ) y= \left\{ \begin{aligned} & \ 0& (x < 0)\\ & \ x& (x \geq 0) \end{aligned} \right.


BatchNorm(批 归一化)
模型稳定需要稳定的数据分布
对输入数据做的标准化(也称作归一化)使其均值为0方差为1,但对于深度神经网络(多层)这是不够的

BatchNorm的想法是对中间层的输出也做标准化,以保证在网络学习的过程中网络层的输出具有稳定的分布
好处:
可以使学习快速进行(能够使用较大的学习率)
可以降低模型对初始值的敏感
可以从一定程度上抑制过拟合

流程

计算mini-batch内样本的均值

计算mini-batch内样本的方差

计算标准化之后的输出(均值为0,方差为1)

对标准化的输出进行平移和缩放(因为如果强行限制输出层的分布是标准化的,可能导致某些特征模式的丢失,所以需要在标准化之后对数据进行平移和缩放)

计算举例
1.输入数据[N,K]一般对应全连接层输出
对K的每一个分量,计算N个样本的均值和方差

2.输入数据[N,C,H,W]一般对应卷积层的输出
沿着C这一维展开,分别对每个通道计算N个样本总共NxHxW个像素点计算均值和方差

(为防止同一样本因批次不同而导致结果不同,BatchNorm采用了滚动平均的方法,在预测时不计算样本内的均值和方差,而是使用训练时保存的值)


Dropout(丢弃法)
一种抑制过拟合的方法
训练阶段:每次随机删除一部分神经元不让其向前传递信息(相当于每次都是让不同的模型在学习)
测试阶段:向前传播所有神经元,相当于让这些不同模型一起工作

但这种方法会出现训练时输出数据总大小变小,测试时预测和训练时数据分布不同的问题

两种解决方法
1.downgrade_in_infer,训练时随机丢弃一部分神经元,预测时不丢弃,但把它们的数值变小
2.upscale_in_train,训练时随机丢弃一部分神经元,但把保留的神经元数值放大,预测时原样输出所有神经元信息(预测时不做任何处理)
Paddlepaddle中默认第一种方法

Dropblock
将Dropout的随机drop改为每次集中drop,可以进一步避免过拟合
课程地址

猜你喜欢

转载自blog.csdn.net/weixin_45441838/article/details/106309418