携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第25天,点击查看活动详情
在上一篇文章中,我们介绍了特征工程,并从特征工程的角度理解计算机视觉的常见的问题。
今天,我们来介绍卷积神经网络,卷积层的定义,常见的卷积操作,池化层,上采样,激活曾,BathNorm层,全连接层,Dropout层,损失层。
-
1.1 卷积神经网络
-
卷积神经网络:以卷积层为主的深度网络结构
-
1.1.1 卷积层的定义
-
对图像和滤波矩阵做内积(逐个元素相乘再求和的操作)
- nn.Conv2d(in_channels, out_channels, kernel_size, stride=1, padding=0, dilation=1, groups=1, bias=True)
-
1.1.2 常见的卷积操作
-
标准卷积
-
分组卷积(group参数)
-
空洞卷积(dilation参数)
-
深度可分离卷积(分组卷积+1x1卷积)
-
反卷积(torch.nn.ConvTranspose2d):转置卷积,上采样
-
可变形卷积
-
等
-
1.1.3 如何理解卷积层感受野?
-
感受野(Receptive Field),指的是神经网络中神经元“看到的”输入区域,再卷积神经网络中,feature map上某个元素的计算受输入图像上某个区域的影响,这个区域即该元素的感受野。
-
对于第二层,在上一层对应到的是3x3的区域,这个3x3的区域就是一个感受野;第三层的每一个元素对应第二层的3 x3的区域,第二层的每一个元素对应第一层的3x3的区域,所以对于第三层而言,对应第二层的3x3的区域,对应第一层的5x5的区域,经过三层卷积之后,第三层对应原图的感受野是5x5的。
-
用小的卷积核来代替大的卷积核,可以加深网络,可以增大网络的非线性表达能力,因为可以对每一层加一个relu来进行激活,引入非线性的变化因素。
-
1.1.4 如何理解卷积层的参数量与计算量
-
1.1.5 如何压缩卷积层参数&计算量
-
从感受野不变+减少参数量的角度压缩卷积层
- 采用多个3x3卷积核代替大卷积核
- 采用深度可分离卷积
- 通道shuffle
- Pooling层
- Stride=2
- 等
-
1.2 池化层
-
对输入的特征图进行压缩
- 一方面使特征图变小,简化网络计算复杂度
- 一方面进行特征压缩,提取主要特征
-
最大池化(Max Pooling)、平均池化(Average Pooling)等
-
nn.MaxPool2d(kernel_size, stride=None,Padding=0,dilation=1, return_indices=False, ceil_mode=False)
-
-
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
- 主要用于检测,回归