Pytorch 卷积神经网络参数说明一

发布于:2025-06-15 ⋅ 阅读:(20) ⋅ 点赞:(0)

系列文章目录



前言

  在前两个实战中,我们只学会了如何搭建神经网络,但是里面有些函数接口不明白怎么回事,在这篇文章中,我们会逐一解答。


一、卷积层的定义

nn.Conv2d(in_channels,out_channels,kernel_size,stride=1,padding = 0,dilation = 1,groups = 1,bias = True)

  1. 输入通道
  2. 输出通道
  3. 卷积核大小
  4. 移动步长
  5. 卷积核膨胀

卷积核的大小一般是 3 x 3,卷积的时候,以该元素为中心形成一个 3 x 3的格子,然后与卷积核做内积。不懂的话去小破站学学,很简单,这里不是重点。输入通道和输出通道不用过多解释,卷积核的数量。padding = 1 我们有时候发现靠边的元素卷积不够,需要进行拓展,这句话就是添加一行和一列,完成边缘元素的卷积。dilation = 1,这个是为了增加卷积核的视野感受范围,3 x 3 的卷积核变成 7 x 7 的卷积核,在分割网络中常用。卷积一个元素之后,stride = 1 移动的步长,如果等于 2 就有些元素没有中心卷积。groups = 1 分组卷积,一个卷积核为一组,可以降低计算量,主要在深度可分离卷积中。bias=True 偏执量,输出的结果经过 y = wx+b wx 可以理解卷积,b就是我们家的偏置量。

1.常见的卷积操作

  • 分组卷积
  • 空洞卷积
  • 深度可分离卷积( 分组卷积 + 1 x 1 卷积)
  • 反卷积
  • 可变型卷积,卷积核不是固定的。

2. 感受野

  指的是神经网络中卷积核看到的区域,在神经网络中,feature_map 某个元素的计算受到输入图像上某个区域的影响,这个区域就是该元素的感受野。

图 1 感受野
从图片中可以看到,卷积和的大小是 1 个与两个 3 x 3 ,两个卷积核的感受野为 5x5=25,j计算为 2 x 3 x 3 =18,如果换成大的 5 x 5 的卷积核,那么感受野的范围没有变,但是计算量变成25,显然我们一般采取小的卷积核。这样还有一个好处,网络的非线性还会增强,计算量还降低了。

3. 如何理解参数量和计算量

  • 参数量:参与计算参数的个数,占用内存空间:对于一个卷积核而言参数量: ( C i n ∗ ( K ∗ K ) + 1 ) ∗ C o u t (Cin*(K*K)+1)*Cout (Cin(KK)+1)Cout
  • FLOPS:每秒浮点运算次数,可以理解是速度,用来衡量硬件的性能。
  • FLOPs:s小写,这个就是计算量,衡量算法模型的复杂度:
    ( C i n ∗ 2 ∗ K ∗ K ) ∗ H o u t ∗ W o u t ∗ C o u t (Cin * 2 * K* K ) * Hout * Wout * Cout (Cin2KK)HoutWoutCout
  • MAC:乘加的次数
    C i n ∗ K ∗ K ∗ H o u t ∗ W o u t ∗ C o u t Cin * K* K * Hout * Wout * Cout CinKKHoutWoutCout

  FLOPs 把乘加分开算,所以乘以2,MAC 算一次,所以是 1。

4.如何减少计算量和参数量

   减少计算量很参数量还是要在卷积层动脑子,在不改变感受野和减少参数量的角度压缩矩阵:

  • 采用多个 3 x 3 的卷积核代替大的卷积核。
  • 采用深度可分离卷积核,即分组卷积
  • 通道 Shuffle
  • Pooling 层:快速下采样,可能有信息的损失。一般在前两个卷积核使用。
  • Stride = 2:卷积的步长加大
    等等

二、神经网络结构:有些层前面文章说过,不全讲

  神经网络基本可以分成这三种金典的结构,如图 2 所示。串联结构、跳连结构、并连结构。跳连结构是把部分输出直接作为输出,这样可以大幅度减少计算量。

图 2 神经网络结构

1. 池化层(下采样)

  池化层对输入特征的压缩:

  • 一方面使特征图变小,简化网络计算复杂度。
  • 一方面进行特征压缩,提取主要特征。

池化层常用两种方法:最大池化(Max Pooling)和平均池化(Average Poling),
nn.MaxPool2d(kernel_size = ,Stride = ,pading =0 ,dilation = 1,return_indeces = False,ceil_mode = False)
前四个参数就不说了,上面有。这个 return_indeces,返回的是最大值的索引,这样当我们恢复原图的时候有很大作用,相似度更近。下面是一张最大池化的图:

图 3 池化层
在 2x2 的卷积核中,取出一个最大值,4 x 4 的特征变成了一个有最大值组成 2 x 2 的特征图,这样实现了降维的目的。

2. 上采样

  上采样有两种方式:

  • Resize,如双线性插值直接放缩,类似于图像放缩。
  • 反卷积:Deconvolution,即 Transposed Convolution

代码摘要:

nn.functional.interpolate(input,size = None,scalar_factor = None,model = 'nearest',align_corners = None)

nn.ConvTranspose2d(in_channels,out_channels,kernel_size, stride = 1,padding = 0,bias = True)

通常我们采用Resize进行重构,计算量小,反卷积的计算量很大。

3. 激活层、BN层、FC层

  在卷积层,其实就是一个线性操作y = wx +b w 和 b 就是卷积核的参数,线性函数并不能很好去拟合数据样本,所以我们提出激活函数来解决这一问题,旨在提高网络的非线性表达。

  • 激活函数:为了增加网络的非线性,进而增加网络的表达能力。
  • 常用函数:ReLU函数、Leakly ReLU函数、ELU 函数等
  • 语句:torch.nn.ReLU(inplace = True)

1).BatchNorm 层

  • 通过一定的规范化手段,把每层神经网络任意神经元的输入值分布强行拉倒j标准正态分布上面,均值 0 ,方差 1.
  • BatchNorm 是一种归一化的手段,他会减少图像之间的绝对差异,突出相对差异,加快模型的训练速度。
  • 不适合 image to image 和对噪声敏感的任务中
  • 语句:nn.BatchNorm2d(num_features,eps = 1e-05,momentum =0.1,affine = True,track_runing_stats = True )

BatchNorm 层可以理解为工具层,我们在卷积层也可以加入,后面在更一个ReLU层,往往就是这么干的。

2).FC 全连接层

  连接所有的特征,把输出值送给分类器(softmax层)。

  • 对前层的特征进行一个加权和,(卷积层是将输入数据映射到隐层特征空间) ,将特征空间通过线性变化映射到样本标记空间。
  • 也可以通过 1 x 1 卷积 + gloable average pooling 代替。
  • 全连接层的参数冗余,一般情况需要 Dropout 限制参数。
  • FC 层对图片的大小尺寸非常敏感。
  • 语句:nn.Linear(in_features,out_features,bias)

3). dropout 层

  • 在不同的训练中随机扔掉一些神经元。
  • 在测试中不实用随机失活,那么所有的神经元都激活。
  • 作用:为了防止和减轻过拟合才使用的函数,一般用在全链接层。
  • 语句:nn.dropout

4). 损失层

  在网络优化,反向传播时非常重要的一个层,损失函数选择取决于我们要训练的任务。

  • 损失层:设置一个损失函数用来比较输出值和目标值,通过最小损失来驱动网络的训练。
  • 网络的损失通过前向操作计算,网络的参数相较于损失函数,通过后向操作计算。
  • 分类问题损失:
    • nn.BCELoss
    • nn.CrossEntrophyLoss 等等
  • 回归问题损失:
    • nn.L1Loss
    • nn.MSELoss
    • nn.SmoothL1Loss 等等

鸣谢

  年龄越大,越不想欠谁。一生活得洒脱,一个人,几个人也快乐。如果本文对大家有帮助,还请大家浏览一下我弟新开的小店,要黄了,哈哈哈。点击这里