系列文章目录
第二章 深度学习基础——层和函数
2.2填充Padding、步幅Stride、空洞Dilation
2.2 反卷积的strides。卷积的strides是在卷积核元素之间插入0元素,反卷积的strides是在输入特征图元素之间插入0元素。
前言
全连接、卷积、池化是深度学习网络模型的基本单元,这些基础的层加上激活函数、损失函数、上采样等可以任意组合成不同的网络模型。
一、简介
人工神经网络是由全连接层、卷积层、池化层组成的,其他基本元素还包括:激活函数、损失函数和归一化等。
二、全连接层
1.线性回归模型
模型的线性关系描述为:
2.神经元
一个神经元类似一个线性回归模型,包括:线性模型,激活函数。线性模型的计算结果经过一个激活函数后才是最终的输出。
经典的全连接层使用Sigmod非线性激活函数,线性模型的输出经过sigmod后会映射到0-1之间:
3.多层感知机
三、激活函数
如果在神经网络中去掉激活函数,则单个神经元就是线性模型。如果使用线性激活函数或者没有使用一个激活函数,即使多层神经网络有很多隐藏层,整个神经网络只是把输入线性组合再输出,等效于一个没有隐藏层的神经网络。所以神经网络中一定要使用非线性激活函数。
在全连接层中讲到了sigmod激活函数,除sigmod之外还有其他可用激活函数。
1.sigmod与tanh
在不同的情况下,会使用不同的激活函数:
- tanh函数或者双曲正切函数是总体上都优于sigmoid函数的激活函数。结果表明,在隐藏层上使用tanh函数,效果总是优于sigmoid函数。因为函数值域在-1和+1的激活函数,其均值是更接近零均值的。因此,很多研究者基本已经不用sigmoid激活函数了,tanh函数在几乎所有场合都优于sigmoid函数。
- 在特殊的情况下,例如二分类的输出层,需要使用sigmoid激活函数。因为y的值是0或1,所以想让模型输出的数值介于0和1之间,而不是在-1和+1之间。所以需要使用sigmoid激活函数。
- sigmoid函数和tanh函数两者共同的缺点是:在 z 特别大或者特别小的情况下,导数的梯度或者函数的斜率会变得特别小,最后就会接近于0,导致降低梯度下降的速度。
2.修正线性单元ReLU
ReLU是激活函数的默认选择。如果在隐藏层上不确定使用哪个激活函数,那么通常会使用ReLU激活函数。
ReLU的优点包括:
- ReLU及其导数在程序实现就是一个if-else语句,而sigmoid函数需要进行浮点四则运算。在实践中,使用ReLu激活函数神经网络通常会比使用sigmoid或者tanh激活函数学习的更快。
- sigmoid和tanh函数的导数在正负饱和区的梯度都会接近于0,这会造成梯度弥散;而Relu函数的导数是常数,不会产生梯度弥散现象。
3.LeakyReLU
ReLU进入负半区的时候,梯度为0,对应的W不会再更新,神经元此时不会被训练,产生所谓的稀疏性。而Leaky ReLU不会有这问题,允许激活函数在负半轴也有小的斜率。
Leaky ReLU函数通常比ReLU激活函数效果要好,尽管在实际中Leaky ReLU使用的并不多。
4.PReLU
PReLU在负半轴的斜率是可变可学习的。
四、卷积层
如果以一维向量表示一张图片,并作为多层感知机的输入,则多层感知机的参数量将非常大。而且以一维向量的形式表示一张图片,本来在同一列且相邻的像素点在一维向量上并不相邻,会在一定程度上丢失空间结构信息。
1.图像卷积数学基础
卷积是数学分析中的一种积分变换的方法,在图像处理中采用的是卷积的离散形式。
连续卷积:
离散卷积:
多维离散卷积:
、
二维图像卷积:
二维图像卷积相当于将卷积核旋转180度之后的二维离散卷积。所以在卷积神经网络中,卷积层的实现方式实际上是数学中定义的互相关 (cross-correlation)运算,与数学分析中的卷积定义有所不同。
2.卷积层
2.1卷积计算过程
2.2填充Padding、步幅Stride、空洞Dilation
添加Padding、Stride、Dilation后的卷积公式:
a)Half padding, no strides:在图片的外围填充,避免卷积之后特征图尺寸变小
b)No padding, strides:卷积核尺寸为3,Padding为1,Strides为2且输入特征图尺寸为偶数的时候,输出特征图尺寸恰好为输入的
一半。
c) No padding, no stride, dilation:在保持卷积核尺寸不变的情况下,扩大感受野
卷积后的特征图尺寸计算方式为:
2.3 多输入通道、多输出通道
a) 多输入通道+单输出通道
b) 多输入通道+多输出通道
2.4 多Batch
五、池化层
池化是使用某一位置的相邻输出的总体统计特征代替网络在该位置的输出,它实际上是一种形式的降采样。
a)当输入数据做出少量平移时,经过池化函数后的大多数输出还能保持不变。也就是说,经过池化后特征的相对位置并不会发生改变。
b) 由于池化之后特征图会变小,如果后面连接的是全连接层,能有效的减小神经元的个数,节省存储空间并提高计算效率。
在卷积神经网络中,通常使用2×2大小的池化窗口,步幅也使用2,填充为0,则输出特征图的尺寸为:
通常有两种方法,平均池化和最大池化,其中“最大池化(Max pooling)”是最为常见的。(最大池化的实际作用就是,如果在过滤器中提取到某个特征,那么保留其最大值;如果没有提取到这个特征,可能在感受野中不存在这个特征,这就是最大池化的直观理解。*必须承认,人们使用最大池化的主要原因是此方法在很多实验中效果都很好。)
六、损失函数
损失函数是用来评估预测值与真实值的不一致程度,是一个非负实函数。
在模型的训练阶段,训练数据输入模型后,通过前向传播输出预测值。接着损失函数会计算出预测值和真实值之间的差异。然后使用梯度下降法,通过反向传播更新模型中的参数,使得模型的预测值往真实值方向靠拢,从而达到学习的目的。
损失函数分为基于距离度量的损失函数(包括均方误差损失函数(MSE)、L2损失函数、L1损失函数、Smooth L1损失函数、huber损失函数)和基于概率分布度量的损失函数(KL散度函数(相对熵)、交叉熵损失、Focal loss)。
1.交叉熵损失函数
分类问题的最后一层网络,需要分类函数Sigmoid或者Softmax,如果再接均方差函数的话,其求导结果复杂,运算量比较大。用交叉熵函数的话,可以得到比较简单的计算结果,一个简单的减法就可以得到反向误差。
分类问题通常使用交叉熵损失函数。二分类问题的神经网络最后一层使用Sigmod激活函数将输出映射到0-1区间之后,再使用交叉熵损失函数;多分类问题的神经网络最后一层使用Softmax将网络输出映射到0-1区间,且保证对应各类的输出和为1,再使用交叉熵损失函数。
2. 均方差损失函数
回归问题通常用均方差损失函数,可以保证损失函数是个凸函数,即可以得到最优解。而分类问题如果用均方差的话,损失函数的表现不是凸函数,就很难得到最优解。而交叉熵函数可以保证区间内单调。
七、反卷积及上采样
1. 数学上的反卷积
数学上的反卷积,就是卷积的逆操作。
例,4*4的输入,与3*3的卷积核卷积,输出为2*2
将输入4*4矩阵展开为16*1的向量,将输出2*2矩阵展开为4*1的向量,则上述卷积用矩阵乘法表示为,卷积核相当于一个4*16的矩阵。
那么对应的反卷积为是16*4的矩阵。
2.转置卷积
图像处理中的反卷积的标准叫法是转置卷积,并不是真正意义数学上的反卷积。
a)转置卷积的矩阵形式
b)转置卷积的直观理解
因此就结论而言,卷积操作是多对一,而转置卷积操作是一对多。
c)深度学习中的转置卷积
从本质来说,转置卷积不是一个卷积。深度学习中通过卷积等效实现一个转置卷积,此种方式并不能还原之前的矩阵,只能还原之前的矩阵尺寸。
2.1 反卷积的padding
2.2 反卷积的strides。卷积的strides是在卷积核元素之间插入0元素,反卷积的strides是在输入特征图元素之间插入0元素。
3.上采样
由于卷积核一般比原始图像小,所以卷积之后的图像尺寸往往会变小。有时候我们需要将卷积后的图像还原成原始图像的尺寸,即实现图像从小分辨率到大分辨率的映射,这种操作就叫做上采样(Upsampling)。
反卷积正是一种上采样方法。其他的图像上采样方法还包括:
3.1 基于插值的上采样
包括最近邻插值、双线性插值、双三次插值。
3.2 Unpolling方法
第一种是Nearest Neighbor,就是把相同的数据复制4个达到扩大四倍的效果
第二种是”Bed of Nails”,把数据防止在对应位置的左上角,然后其余的地方补0
第三种方法是Max Unpooling,对于一部分网络模型来讲,上采样和下采样的结构往往是对称的,我们可以在下采样做Max Pooling的时候记录下来最大值所在的位置,当做上采样的时候把最大值还原到其对应的位置,然后其余的位置补0
参考文献
飞桨PaddlePaddle-源于产业实践的开源深度学习平台
https://www.cnblogs.com/geeksongs/p/11132692.html
https://github.com/vdumoulin/conv_arithmetic?tab=readme-ov-file
反卷积(Transposed conv deconv)实现原理(通俗易懂)-优快云博客
总结
简单整理,部分细节后续补充。