Pytorch——卷积神经网络

405 阅读4分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第25天,点击查看活动详情


上一篇文章中,我们介绍了特征工程,并从特征工程的角度理解计算机视觉的常见的问题。

今天,我们来介绍卷积神经网络,卷积层的定义,常见的卷积操作,池化层,上采样,激活曾,BathNorm层,全连接层,Dropout层,损失层。


  • 1.1 卷积神经网络

  • 卷积神经网络:以卷积层为主的深度网络结构

K3V}@K8~SXKR2_F5DK(A}96.png

  • 1.1.1 卷积层的定义
  • 对图像和滤波矩阵做内积(逐个元素相乘再求和的操作)

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

1AG82O_DXPJHB}B@PB(`ATS.png

  • 1.1.2 常见的卷积操作
  • 标准卷积

  • 分组卷积(group参数)

  • 空洞卷积(dilation参数)

  • 深度可分离卷积(分组卷积+1x1卷积)

  • 反卷积(torch.nn.ConvTranspose2d):转置卷积,上采样

  • 可变形卷积

  • 1.1.3 如何理解卷积层感受野?
  • 感受野(Receptive Field),指的是神经网络中神经元“看到的”输入区域,再卷积神经网络中,feature map上某个元素的计算受输入图像上某个区域的影响,这个区域即该元素的感受野

6.png

  • 对于第二层,在上一层对应到的是3x3的区域,这个3x3的区域就是一个感受野;第三层的每一个元素对应第二层的3 x3的区域,第二层的每一个元素对应第一层的3x3的区域,所以对于第三层而言,对应第二层的3x3的区域,对应第一层的5x5的区域,经过三层卷积之后,第三层对应原图的感受野是5x5的

  • 用小的卷积核来代替大的卷积核,可以加深网络,可以增大网络的非线性表达能力,因为可以对每一层加一个relu来进行激活,引入非线性的变化因素。

  • 1.1.4 如何理解卷积层的参数量与计算量

7.png

  • 1.1.5 如何压缩卷积层参数&计算量
  • 从感受野不变+减少参数量的角度压缩卷积层

    • 采用多个3x3卷积核代替大卷积核
    • 采用深度可分离卷积
    • 通道shuffle
    • Pooling层
    • Stride=2

`~NXJ_QEECL_KFIYQYV9K@H.png

  • 1.2 池化层

  • 对输入的特征图进行压缩

    • 一方面使特征图变小,简化网络计算复杂度
    • 一方面进行特征压缩,提取主要特征
  • 最大池化(Max Pooling)、平均池化(Average Pooling)等

  • nn.MaxPool2d(kernel_size, stride=None,Padding=0,dilation=1, return_indices=False, ceil_mode=False)

  • 8.png

  • 1.3 上采样

  • Resize,如双线性插值直接缩放,类似于图像缩放,概念可见最邻近插值算法双线性插值算法——图像缩放

  • Deconvolution,也叫Transposed Concolution

  • 实现函数

    • nn.functional.interpolate(input, size=None, scale_factor=None, mode='nearest', align_corners=None)
    • nn.ConTranspose2d(in_channels, out_channels, kernel_size, stride=1, padding=0, output_padding=0, bias=True)
  • 1.4 激活层

  • 激活函数:未来增加网络的非线性,进而提升网络的表达能力

    • 对于卷积神经网络而言,如果全是卷积的话,就只是线性的运算,那么网络就是线性的网络,线性的网络的表达是非常差的,我们就需要增加非线性的网络结构来增加表达能力
  • ReLU函数、Leakly ReLU函数、ELU函数等

  • torch.nn.ReLU(inplace=True)

  • 在使用过程中,基本上每一个卷积层都会配一个relu层

  • 1.5 BatchNorm层

  • 通过一定的规范化手段,把每层神经网络任意神经元这和输入值的分布强行拉回到均值为0方差为1的标准正态分布

  • Batchnorm是归一化的一种手段,它会减小图像之间的据对差异,突出相对差异,加快训练速度

  • 不适用的问题:image-to-image以及对噪声敏感的任务

  • nn.BatchNorm2d(num_features, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)

  • 1.6 全连接层

  • 连接所有的特征,将输出值送给分类器(如softmax分类器)

    • 对前层的特征进行一个加权和,(卷积层是将数据输入映射到隐层特征空间)将特征空间通过线性变换映射到岩本标记空间(也就是label)
    • 可以通过1x1卷积+global average pooling代替
    • 可以通过全连接层参数冗余
    • 全连接层参数和尺寸相关
  • nn.Linear(in_features, out_features, bias)

  • 1.7 Dropout层

  • 在不同的训练过程中随机扔掉一部分神经元(减少参数)

  • 测试过程中不适用随机失活,所有神经元都激活

  • 为了防止或减轻过拟合而使用的函数,它一般用在全连接层

  • nn.dropout

  • 1.8 损失层

  • 损失层:设置一个损失函数用来比较网络的输出和目标值,通过最小化损失来驱动网络的训练

  • 网络的损失通过前向操作计算,网络参数相对于损失函数的梯度则通过反向操作计算

  • 分类问题的损失 -> 离散值

    • nn.BCELoss; nn.CrossEntropyLoss
    • 主要用于分类/分割
  • 回归问题的损失 -> 连续纸

    • nn.L1Loss; nn.MSELoss; nn.SmoothL1Loss
    • 主要用于检测,回归

9JQ4ZCQY3M({Q$KEN%9BFQX.png