美文网首页
神经网络基础篇-2-神经网络的层次结构

神经网络基础篇-2-神经网络的层次结构

作者: Mr_Michael | 来源:发表于2023-08-22 12:47 被阅读0次

    神经网络的层次结构分为三大层:输入层,隐藏层,输出层。其中最为重要的是隐藏层,它包括四大部分:卷积层、激活层、池化层、全连接层。

    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)不同卷积方法及输出维度计算

    卷积神经网络相关计算总结

    CNN中的参数解释及计算

    valid卷积

    • 最常用的下采样卷积,其特点是卷积核不能超出特征图的范围。

    • 输出的特征图维度计算公式

      • 输出宽度 = (输入宽度−卷积核宽度 + 2⋅填充宽度) / 步长+1

      • 输出高度 = (输入高度−卷积核高度 + 2⋅填充高度) / 步长+1

      • 输出通道数 = 卷积核数量

    full卷积

    • 典型的上采样卷积,其特点式卷积核可以超出特征图的范围,但是卷积核的边缘要与特征图的边缘有交点。

    • 输出的特征图维度计算公式同valid卷积。

    same卷积

    • 介于full卷积和valid卷积之间的一种卷积方式,其特点是卷积前后特征图的尺寸不变。由于same卷积的特点,其Padding值是固定设置的。

    • Padding计算式可通过上述公式推导得出

      • Skernel 代表卷积核的步长, Dkernel 代表卷积核的维度, Padding 代表扩充值的维度。

    反卷积

    一种常用的上采样方法。反卷积可以将图像恢复到卷积之前的尺寸,输出尺寸的计算式为:

    其中:

    2)常用卷积层算子

    1. 一维卷积层算子 (nn.Conv1d):

      用于处理一维的信号数据,如时序数据、文本数据等。它在输入数据的一个滑动窗口上应用可学习的卷积核,产生新的特征图。可以通过改变卷积核大小、填充方式、步长等超参数来控制输出尺寸。

    2. 二维卷积层算子 (nn.Conv2d):

      用于处理二维的图像数据,它通过在输入数据的一个滑动窗口上应用可学习的卷积核,计算出新的特征图。二维卷积层算子也可以通过改变卷积核大小、填充方式、步长等超参数来控制输出尺寸。

    3. 三维卷积层算子 (nn.Conv3d):

      用于处理三维的图像数据,如视频数据等。它在输入数据的一个滑动窗口上应用可学习的卷积核,计算出新的特征图。三维卷积层算子也可以通过改变卷积核大小、填充方式、步长等超参数来控制输出尺寸。

    4. 反卷积层算子 (nn.ConvTranspose2d):

      是卷积层算子的逆过程,用于上采样特征图。将输入数据进行插值,并在插值结果上应用可学习的卷积核,产生新的特征图。同样地,反卷积层算子也可以通过改变卷积核大小、填充方式、步长等超参数来控制输出尺寸。

    5. 深度可分离卷积层算子 (nn.Conv2d(depthwise=True, pointwise=True)):

      是一种轻量级卷积层算子,它将卷积操作分解为两个步骤:深度卷积和逐点卷积。

      • 深度卷积先对输入特征图的每一个通道应用一个可学习的卷积核,产生新的特征图。

      • 逐点卷积则将多个深度卷积的结果在通道维度上进行拼接,并应用另一个可学习的卷积核来产生最终的输出特征图。

    2.非线性激活层 Non-Linear Activations

    • 激活层的作用:通过激活函数,加入非线性因素的,增加模型的非线性表达能力

      • 卷积运算是一种局部线性变换,属于稀疏连接。

      • 如果连续多层卷积但只使用线性激活函数或者没有使用激活函数,那么无论神经网络有多少层一直在做的只是计算线性函数,退化为一层。

    • 激活函数应该具有的性质:

      • 非线性:线性激活层对于深层神经网络没有作用,因为其作用以后仍然是输入的各种线性变换。。

      • 连续可微:梯度下降法的要求。

      • 范围最好不饱和:当有饱和的区间段时,若系统优化进入到该段,梯度近似为0,网络的学习就会停止。

      • 单调性:当激活函数是单调时,单层神经网络的误差函数是凸的,好优化。

      • 在原点处近似线性:这样当权值初始化为接近0的随机值时,网络可以学习的较快,不用可以调节网络的初始值。

    1)常用激活函数

    Pytorch的22个激活函数

    常用激活函数的比较

    从零开始学CV之一激活函数篇(Activation Function)

    1. Sigmoid 函数 (torch.nn.Sigmoid):

      一种典型的压缩型激活函数,将输入值压缩到 0 到 1 的范围内。它在神经网络中广泛使用,特别是在二分类问题中。

    2. Tanh 函数 (torch.nn.Tanh):

      Tanh 函数在输入值较大或较小的情况下,输出值趋向于 1 或 -1,且在输入接近 0 时具有更大的斜率。因此,Tanh 函数比 Sigmoid 函数更适合在神经网络中作为激活函数使用,尤其在对称性问题上有较好的表现,在 RNN 中也有广泛应用。

    3. ReLU 函数 (torch.nn.ReLU):

      一种常用的激活函数,它在输入值大于 0 时返回该值本身,否则返回 0。相对于 Sigmoid 和 Tanh 函数,ReLU 函数具有更好的性能和计算速度,也更容易学习。ReLU 函数的一个变种是 LeakyReLU 函数。

    4. Softmax 函数 (torch.nn.Softmax):

      一种常用的激活函数,根据输入的 logits 在多个类别之间进行归一化,从而得到分类结果。它通常用于分类问题中,输出结果是每个类别的概率分布。

    5. ELU 函数 (torch.nn.ELU):

      一种平滑的激活函数,可以防止梯度消失和过拟合问题。它在输入值小于 0 的情况下也有非零输出,具有类似于 ReLU 函数的优点。相对于 ReLU 函数,ELU 函数可以使训练速度更快,同时也有更好的准确性。

    6. SELU 函数 (torch.nn.SiLU):

      由谷歌提出的一种新型激活函数,它可以优化深度神经网络的性能,尤其是在图像分类和自然语言处理领域。Swish 函数与 Sigmoid 函数类似,但它在输入值较大时还是具有非零输出,可以增强激活函数的非线性性。

    3.池化层 Pooling Layer

    池化窗口从输入数组的最左上方开始,按从左往右、从上往下的顺序,依次在输入数组上滑动。当池化窗口滑动到某一位置时,窗口中的输入子数组的最大值/平均值即输出数组中相应位置的元素。

    池化层是通过下采样,通过去掉Feature Map中不重要的样本,从而对输入的特征图进行压缩。

    池化层往往在卷积层后面,通过池化来降低卷积层输出的特征向量,同时改善结果(不易出现过拟合)。


    池化层的作用:

    • 特征不变性:池化操作就是图像的resize,图像压缩时去掉的信息只是一些无关紧要的信息,而留下的信息则是具有尺度不变性的特征,是最能表达图像的特征。

    • 特征降维,一幅图像含有的信息是很大的,特征也很多,但是有些信息对于我们做图像任务时没有太多用途或者有重复,可以把这类冗余信息去除,把最重要的特征抽取出来,这也是池化操作的一大作用。

    • 在一定程度上防止过拟合,更方便优化。

    池化方法:

    • 最大池化:找到池化窗口中最大的数作为输出值。

    • 平均池化:池化窗口中的平均值作为输出值。

    1)常用池化层算子

    1. Max Pooling (torch.nn.MaxPool2d):

      池化层中最常用的一种算子,它通过选取输入张量中每个大小为 kernel_size 的滑动窗口中的最大值,来减小输入特征图的尺寸。Max Pooling 的主要作用是提取特征并减小计算量,同时也有一定抗噪能力。

    2. Average Pooling (torch.nn.AvgPool2d):

      在给定滑动窗口大小的情况下,将窗口中所有像素的平均值作为当前像素的池化值。与 Max Pooling 相比,Average Pooling 能够更为平滑和稳定地减小特征图的尺寸。

    3. Global Average Pooling (torch.nn.AdaptiveAvgPool2d):

      对整个特征图进行操作,将每个通道的所有像素取平均值作为最终的输出特征。与常规平均池化不同,Global Average Pooling 的池化窗口大小动态适应于输入特征图的大小,因此可以更加有效地提取整个特征图的有效信息,而不是只关注其中的部分信息。

    4. 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)常用归一化层算子

    1. Batch Normalization (torch.nn.BatchNorm2d):

      在深度学习模型中广泛使用的一种归一化技术,它通过对每个 mini-batch 中的数据进行标准化,来减少训练过程中的内部协变量转移问题。

      主要作用是加速训练过程,同时可以防止梯度消失,提高模型的稳定性。在使用 BN 时,通常要注意输入数据维度与 Batch Normalization 层的通道数对应。

    2. Instance Normalization (torch.nn.InstanceNorm2d):

      在每个样本上执行标准化,而不是在每个 mini-batch 上执行标准化的技术,它通常用于风格迁移等图像合成问题中。Instance Normalization 不会引入 mini-batch 内的变化,并且适用于较小的 mini-batch。

    3. 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)常用全连接层算子

    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模型转换的时候,由于部分算子进行融合,因此总的参数量降低,而显存占用也因此减少。

    相关文章

      网友评论

          本文标题:神经网络基础篇-2-神经网络的层次结构

          本文链接:https://www.haomeiwen.com/subject/pissmdtx.html