神经网络的层次结构分为三大层:输入层,隐藏层,输出层。其中最为重要的是隐藏层,它包括四大部分:卷积层、激活层、池化层、全连接层。
1.卷积层 Convolution Layer
卷积的原理
- 在三维输入特征图上滑动一定大小的窗口,在每个可能的位置停留并提取三维特征图块(win_hwin_winput_d),将三维图块与权重矩阵(卷积核)做张量积,转换成形状为input_d的一维向量。最后将所有一维向量转换为三维输出特征图(hwoutput_d)。
卷积层的作用
通过卷积核在原始图像上平移来提取特征。
备注:卷积核为1x1的卷积层 等价于全连接层。卷积层可以看作是计算量和准确度的一种妥协。
卷积神经网络的优点
局部连接:每个神经元不再和上一层的所有神经元相连,而只和一小部分神经元相连。这样就减少了很多参数。
权值共享:用一个卷积核去卷积一张图,这张图每个位置是被同样数值的卷积核操作的,权重是一样的,也就是参数共享。
下采样:可以使用Pooling来减少每层的样本数,进一步减少参数数量,同时还可以提升模型的鲁棒性。
卷积层相关概念
(单个)卷积核通道数 :等于卷积输入层的通道数。
卷积输出层通道数:等于卷积核的个数,也叫输出特征图的深度。它决定了卷积操作之后生成的feature map数量。
卷积核的大小:卷积核=图块尺寸x输出特征图的深度,卷积核可以理解为人工神经网络中的权重大小。(卷积核一般随机生成,包含[0,1,-1]的矩阵)
偏置项:因为在进行图像线性处理的,需要对图像进分割,偏置项的作用使分割的线性图像可以不过原点。
滑动步长(stride):卷积窗口从输入数组的最左上方开始,按从左往右、从上往下的顺序,依次在输入数组上滑动。我们将每次滑动的行数和列数称为步长(stride)。
填充(padding),因为卷积核按照相应步长移动,卷积核可能会超出图片的范围,因此可以在图片外围进行零填充,保证每一个卷积核都有相应的值与之计算。
1x1卷积的作用
1x1卷积,可以看成一种全连接(计算量和准确度的一种妥协)。
实现跨通道的信息交互和整合。1x1卷积核只有一个参数,当它作用在多通道的feature map上时,相当于不同通道上的一个线性组合,实际上就是加起来再乘以一个系数,但是这样输出的feature map就是多个通道的整合信息了,能够使网络提取的特征更加丰富。
-
feature map通道数的降维和升维:x1卷积可以改变通道数。
-
示例:假设输入的特征维度为100x100x128,卷积核大小为5x5(stride=1,padding=2),通道数为256,则经过卷积后输出的特征维度为100x100x256,卷积参数量为128x5x5x256=819200。
此时在5x5卷积前使用一个64通道的1x1卷积,最终的输出特征维度依然是100x100x256,但是此时的卷积参数量为128x1x1x64 + 64x5x5x256=417792,大约减少一半的参数量。
-
增加非线性映射次数。1x1卷积后通常加一个非线性激活函数,使网络提取更加具有判别信息的特征,同时网络也能做的越来越深。
感受野
- 卷积神经网络每一层输出的特征图(feature map)上的像素点在原始图像上映射的区域大小。
1)不同卷积方法及输出维度计算
valid卷积
-
最常用的下采样卷积,其特点是卷积核不能超出特征图的范围。
-
输出的特征图维度计算公式
输出宽度 = (输入宽度−卷积核宽度 + 2⋅填充宽度) / 步长+1
输出高度 = (输入高度−卷积核高度 + 2⋅填充高度) / 步长+1
输出通道数 = 卷积核数量
full卷积
-
典型的上采样卷积,其特点式卷积核可以超出特征图的范围,但是卷积核的边缘要与特征图的边缘有交点。
输出的特征图维度计算公式同valid卷积。
same卷积
-
介于full卷积和valid卷积之间的一种卷积方式,其特点是卷积前后特征图的尺寸不变。由于same卷积的特点,其Padding值是固定设置的。
-
Padding计算式可通过上述公式推导得出
- Skernel 代表卷积核的步长, Dkernel 代表卷积核的维度, Padding 代表扩充值的维度。
反卷积
一种常用的上采样方法。反卷积可以将图像恢复到卷积之前的尺寸,输出尺寸的计算式为:
其中:
2)常用卷积层算子
-
一维卷积层算子 (
nn.Conv1d
):用于处理一维的信号数据,如时序数据、文本数据等。它在输入数据的一个滑动窗口上应用可学习的卷积核,产生新的特征图。可以通过改变卷积核大小、填充方式、步长等超参数来控制输出尺寸。
-
二维卷积层算子 (
nn.Conv2d
):用于处理二维的图像数据,它通过在输入数据的一个滑动窗口上应用可学习的卷积核,计算出新的特征图。二维卷积层算子也可以通过改变卷积核大小、填充方式、步长等超参数来控制输出尺寸。
-
三维卷积层算子 (
nn.Conv3d
):用于处理三维的图像数据,如视频数据等。它在输入数据的一个滑动窗口上应用可学习的卷积核,计算出新的特征图。三维卷积层算子也可以通过改变卷积核大小、填充方式、步长等超参数来控制输出尺寸。
-
反卷积层算子 (
nn.ConvTranspose2d
):是卷积层算子的逆过程,用于上采样特征图。将输入数据进行插值,并在插值结果上应用可学习的卷积核,产生新的特征图。同样地,反卷积层算子也可以通过改变卷积核大小、填充方式、步长等超参数来控制输出尺寸。
-
深度可分离卷积层算子 (
nn.Conv2d(depthwise=True, pointwise=True)
):是一种轻量级卷积层算子,它将卷积操作分解为两个步骤:深度卷积和逐点卷积。
深度卷积先对输入特征图的每一个通道应用一个可学习的卷积核,产生新的特征图。
逐点卷积则将多个深度卷积的结果在通道维度上进行拼接,并应用另一个可学习的卷积核来产生最终的输出特征图。
2.非线性激活层 Non-Linear Activations
-
激活层的作用:通过激活函数,加入非线性因素的,增加模型的非线性表达能力。
卷积运算是一种局部线性变换,属于稀疏连接。
如果连续多层卷积但只使用线性激活函数或者没有使用激活函数,那么无论神经网络有多少层一直在做的只是计算线性函数,退化为一层。
-
激活函数应该具有的性质:
非线性:线性激活层对于深层神经网络没有作用,因为其作用以后仍然是输入的各种线性变换。。
连续可微:梯度下降法的要求。
范围最好不饱和:当有饱和的区间段时,若系统优化进入到该段,梯度近似为0,网络的学习就会停止。
单调性:当激活函数是单调时,单层神经网络的误差函数是凸的,好优化。
在原点处近似线性:这样当权值初始化为接近0的随机值时,网络可以学习的较快,不用可以调节网络的初始值。
1)常用激活函数
从零开始学CV之一激活函数篇(Activation Function)
-
Sigmoid 函数 (
torch.nn.Sigmoid
):一种典型的压缩型激活函数,将输入值压缩到 0 到 1 的范围内。它在神经网络中广泛使用,特别是在二分类问题中。
-
Tanh 函数 (
torch.nn.Tanh
):Tanh 函数在输入值较大或较小的情况下,输出值趋向于 1 或 -1,且在输入接近 0 时具有更大的斜率。因此,Tanh 函数比 Sigmoid 函数更适合在神经网络中作为激活函数使用,尤其在对称性问题上有较好的表现,在 RNN 中也有广泛应用。
-
ReLU 函数 (
torch.nn.ReLU
):一种常用的激活函数,它在输入值大于 0 时返回该值本身,否则返回 0。相对于 Sigmoid 和 Tanh 函数,ReLU 函数具有更好的性能和计算速度,也更容易学习。ReLU 函数的一个变种是 LeakyReLU 函数。
-
Softmax 函数 (
torch.nn.Softmax
):一种常用的激活函数,根据输入的 logits 在多个类别之间进行归一化,从而得到分类结果。它通常用于分类问题中,输出结果是每个类别的概率分布。
-
ELU 函数 (
torch.nn.ELU
):一种平滑的激活函数,可以防止梯度消失和过拟合问题。它在输入值小于 0 的情况下也有非零输出,具有类似于 ReLU 函数的优点。相对于 ReLU 函数,ELU 函数可以使训练速度更快,同时也有更好的准确性。
-
SELU 函数 (
torch.nn.SiLU
):由谷歌提出的一种新型激活函数,它可以优化深度神经网络的性能,尤其是在图像分类和自然语言处理领域。Swish 函数与 Sigmoid 函数类似,但它在输入值较大时还是具有非零输出,可以增强激活函数的非线性性。
3.池化层 Pooling Layer
池化窗口从输入数组的最左上方开始,按从左往右、从上往下的顺序,依次在输入数组上滑动。当池化窗口滑动到某一位置时,窗口中的输入子数组的最大值/平均值即输出数组中相应位置的元素。
池化层是通过下采样,通过去掉Feature Map中不重要的样本,从而对输入的特征图进行压缩。
池化层往往在卷积层后面,通过池化来降低卷积层输出的特征向量,同时改善结果(不易出现过拟合)。
池化层的作用:
特征不变性:池化操作就是图像的resize,图像压缩时去掉的信息只是一些无关紧要的信息,而留下的信息则是具有尺度不变性的特征,是最能表达图像的特征。
特征降维,一幅图像含有的信息是很大的,特征也很多,但是有些信息对于我们做图像任务时没有太多用途或者有重复,可以把这类冗余信息去除,把最重要的特征抽取出来,这也是池化操作的一大作用。
在一定程度上防止过拟合,更方便优化。
池化方法:
最大池化:找到池化窗口中最大的数作为输出值。
平均池化:池化窗口中的平均值作为输出值。
1)常用池化层算子
-
Max Pooling (
torch.nn.MaxPool2d
):池化层中最常用的一种算子,它通过选取输入张量中每个大小为 kernel_size 的滑动窗口中的最大值,来减小输入特征图的尺寸。Max Pooling 的主要作用是提取特征并减小计算量,同时也有一定抗噪能力。
-
Average Pooling (
torch.nn.AvgPool2d
):在给定滑动窗口大小的情况下,将窗口中所有像素的平均值作为当前像素的池化值。与 Max Pooling 相比,Average Pooling 能够更为平滑和稳定地减小特征图的尺寸。
-
Global Average Pooling (
torch.nn.AdaptiveAvgPool2d
):对整个特征图进行操作,将每个通道的所有像素取平均值作为最终的输出特征。与常规平均池化不同,Global Average Pooling 的池化窗口大小动态适应于输入特征图的大小,因此可以更加有效地提取整个特征图的有效信息,而不是只关注其中的部分信息。
-
Max Unpooling (
torch.nn.MaxUnpool2d
):Max Pooling 的逆运算,可以根据池化之前的位置和最大值,重新生成较高分辨率的特征图。由于 Max Pooling 在池化过程中丢失了输入特征图的某些信息,Max Unpooling 可以帮助模型逆转这些操作。
2)输出维度计算
计算公式同valid卷积
输出宽度 = (输入宽度−池化核宽度 +2⋅填充宽度) / 步长 + 1
输出高度 = (输入高度−池化核高度 +2⋅填充高度) / 步长 + 1
输出通道数 = 卷积/池化核数量
4.归一化层 BN Layer
论文阅读笔记:看完也许能进一步了解Batch Normalization
Batch Normalization(简称BN)就是对每一批数据进行归一化。
-
归一化层作用:防止梯度爆炸和梯度消失。
防止梯度消失:根据链式法则,如果每一层神经元对上一层的输出的偏导乘上权重结果都小于1的话,那么即使这个结果是0.99,在经过足够多层传播之后,误差对输入层的偏导会趋于0。
防止梯度爆炸:同理,根据链式法则,如果每一层神经元对上一层的输出的偏导乘上权重结果都大于1的话,在经过足够多层传播之后,误差对输入层的偏导会趋于无穷大。
备注:采用ReLU激活函数也会有效的解决梯度消失的情况。
1)常用归一化层算子
-
Batch Normalization (
torch.nn.BatchNorm2d
):在深度学习模型中广泛使用的一种归一化技术,它通过对每个 mini-batch 中的数据进行标准化,来减少训练过程中的内部协变量转移问题。
主要作用是加速训练过程,同时可以防止梯度消失,提高模型的稳定性。在使用 BN 时,通常要注意输入数据维度与 Batch Normalization 层的通道数对应。
-
Instance Normalization (
torch.nn.InstanceNorm2d
):在每个样本上执行标准化,而不是在每个 mini-batch 上执行标准化的技术,它通常用于风格迁移等图像合成问题中。Instance Normalization 不会引入 mini-batch 内的变化,并且适用于较小的 mini-batch。
-
Layer Normalization (
torch.nn.LayerNorm
):在整个层的单个样本上执行标准化,而不是在样本间执行标准化的技术,它可以消除不同样本间特征的依赖关系。Layer Normalization 在适用于 RNNs 和序列数据处理等问题时,效果更好。
5.全连接层 Linear Layer
全连接层的输入是一个向量,每个神经元都与上一层的每个神经元相连接,每个连接都带有一个可学习的权重参数。全连接的核心操作就是矩阵向量乘积y=Wx。
-
全连接层的作用:通过特征提取,实现分类或回归。
对于分类问题,全连接层的输出通常选用Softmax函数作为输出。只要全连接层的某个输出节点的输出值大于某阈值,则认为目前的样本属于该输出节点对应的类。
对于回归问题,全连接层的输出通常选用Sigmoid函数作为输出。
-
全连接神经网络的缺点
参数数量太多 考虑一个输入10001000像素的图片,输入层有10001000=100万节点。假设第一个隐藏层有100个节点,那么仅这一层就有(10001000+1)100=1亿参数。
没有利用像素之间的位置信息 对于图像识别任务来说,每个像素和其周围像素的联系是比较紧密的,和离得很远的像素的联系可能就很小了。如果一个神经元和上一层所有神经元相连,那么就相当于对于一个像素来说,把图像的所有像素都等同看待,这不符合前面的假设。当我们完成每个连接权重的学习之后,最终可能会发现,有大量的权重,它们的值都是很小的(也就是这些连接其实无关紧要)。努力学习大量并不重要的权重,这样的学习必将是非常低效的。
网络层数限制 我们知道网络层数越多其表达能力越强,但是通过梯度下降方法训练深度全连接神经网络很困难,因为全连接神经网络的梯度很难传递超过3层。因此,我们不可能得到一个很深的全连接神经网络,也就限制了它的能力。
1)常用全连接层算子
-
torch.nn.Linear
深度学习模型中常用的一种结构,可以用于实现分类、回归等任务。可以通过适当的设置输入特征的数量和输出特征的数量,来满足不同的需求。主要参数如下:
in_features
:输入特征的数量。out_features
:输出特征的数量。bias
:是否添加偏置项。transpose
:是否对权重矩阵进行转置。device
:指定运行的设备。
6.特征图升维
通过卷积和池化等技术可以将图像进行降维,相反,有时也需要成恢复原分辨率大小的图像,特别是在语义分割领域应用很成熟。
1)上池化(UnPooling)
UnPooling是max pooling的逆操作,将在Maxpooling时保留最大值的位置信息扩充Feature Map,除最大值位置以外,其余补0。
2)上采样(UNSampling)
上采样指的是任何可以让图像变成更高分辨率的技术。最简单的方式是重采样和插值:将输入图片进行rescale到一个想要的尺寸,而且计算每个点的像素点。
-
插值:利用已知的点来“猜”未知的点,由原图像矩阵中的点计算新图像矩阵中的点并插入,不同的计算过程就是不同的插值算法。
-
最近邻法(Nearest Interpolation):直接找到原图像中对应的点,将数值赋值给新图像矩阵中的点。计算速度最快,但是效果最差。
-
双线性插值(Bilinear Interpolation):双线性插值是用原图像中最近的4(2*2)个点计算新图像中1个点。
双三次插值(Bicubic interpolation):双三次插值是用原图像中最近的16(4*4)个点计算新图像中1个点,效果比较好,但是计算代价过大。
-
UnSampling没有使用MaxPooling时的位置信息,而是直接将内容复制来扩充Feature Map。
在FCN、U-net等网络结构中,涉及到了上采样。
3)反卷积(Deconvolution)
反卷积又称作转置卷积,是卷积的逆过程。最大的区别在于反卷积过程是有参数要进行学习的,理论是反卷积可以实现UnPooling和unSampling。
7.其他
1)常用数学算子(Math Op)
abs、add、cos、ceil、cum、sum、div、exp、floor、log、mean、mul、max、maximum、min、minimum、round、prod、pow、rsqrt、rsub、sin、sqrt、sub、sum、tan
2)逻辑算子(Logical Op)
bitwise_not、bitwise_xor、eq、gt、ge、le、lt、logical_not、logical_xor、ne、where
3)张量算子(Tensor OP)
cat、chunk、clone、expand、expand_as、flatten、flip、permute、repeat、reshape、slice、split、squeeze、stack、tile、transpose、unsqueeze、view、t
8.参数量计算
卷积神经网络CNN中的参数量(parameters)和计算量(FLOPs)
参数量就是指,模型所有带参数的层的权重参数总量。带参数的层主要有:卷积层、BN层、全连接层等。
- 池化层、激活层、上采样层无需学习参数,只是提供了一种非线性的变换,其参数量为0。
1)卷积层
计算公式:参数量 = (filterSize × depthIn + bias) × filterNum
filterSize:kh*kw 是卷积核的大小
depthIn:输入层特征深度,也是输入通道数。
bias:是否使用偏置项,使用时为1,否则为0
filterNum:该层卷积核个数,也就是输出特征图的深度。
2)BN层
BN层有两个需要学习的参数,缩放系数γ和平移系数β(类似减均值除方差)。
计算公式:参数量 = 2 x depthIn
备注:在预测阶段,通常只有一个样本,那么BN层中的均值和方差都是固定的,那就需要用到训练时的均值和方差通过移动平均而得到。
3)全连接层
全连接层中的每个神经元与其前一层的所有神经元进行全连接。
因此,计算公式:参数量 = (Ti + bias) × To
Ti:输入向量的长度(输入神经元数量)
To:输出向量的长度(输出神经元数量)
bias:是否使用偏置项,使用时为1,否则为0
备注:在进行tensorrt模型转换的时候,由于部分算子进行融合,因此总的参数量降低,而显存占用也因此减少。