网络骨架:Backbone(神经网络基本组成——卷积层)

利用卷积神经网络处理输入图像,生成深层的特征图,再利用各种算法完成区域生成与损失计算,这部分卷积神经网络数整个检测算法的“骨架”,也被称为Backbone
Backbone是物体检测技术的基础,其中也涌现除了多种经典结构,如VGGNet、ResNet和DenseNet等
卷积网络的经典Backbone:

  • VGGNet:走向深度
  • Inception:纵横交错
  • ResNet:里程碑的残差结构
  • DenseNet:多重残差
  • FPN:特征金字塔
  • DetNet:为检测而生

神经网络的基本组成
物体检测算法使用的通常是包含卷积计算且具有深度结构的前馈神经网络,如卷积层、池化层、全连接层等不同的基本层,这些层有着不同的作用:
网络骨架:Backbone(神经网络基本组成——卷积层)_第1张图片

卷积层

深度学习中使用的卷积运算通常是离散的,作为卷积神经网络中最基础的组成部分,卷积的本质是用卷积核的参数来提取数据的特征,通过矩阵点成运算与求和运算来得到结果
如下图所示为一个基本二维卷积的运算过程,公式为y=wx+b 。这里的特征图(x)大小为155,即输入通道数为1,卷积核(w)的大小为3*3,偏置(b)为1,为保证输出维度和输入特征维度一致,还需要有填充(padding),这里使用zero-padding,即用0来填充
网络骨架:Backbone(神经网络基本组成——卷积层)_第2张图片
卷积核参数与对应位置像素逐位相乘后累加作为一次计算结果,以图中左上角为例,其计算过程为:
1×0+0×0+1×0+0×0+1×1+0×8+1×0+0×6+1×7+1 = 9,然后在特征图上进行滑动,即可得到所有的计算结果

>>> import torch
>>> from torch import nn
>>> #使用torch.nn中的Conv2d()搭建卷积层
>>> conv = nn.Conv2d(in_channels=1, out_channels=1, kernel_size=3, stride=1, padding=1, dilation=1, groups=1, bias=True)
>>> #查看卷积核的基本信息,本质上是一个Module
>>> conv
Conv2d(1, 1, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
>>> #通过.weight与.bias查看卷积核的权重与偏置
>>> conv.weight.shape
torch.Size([1, 1, 3, 3])
>>> conv.bias.shape
torch.Size([1])
>>> #输入特征图,需要注意特征必须是四维,第一维作为batch数,即使是1也要保留
>>> input = torch.ones(1,1,5,5)
>>> output = conv(input)
>>> #当前配置的卷积核可以使输入和输出的大小一致
>>> input.shape
torch.Size([1, 1, 5, 5])
>>> output.shape
torch.Size([1, 1, 5, 5])
>>> output
tensor([[[[-0.3512, -0.7530, -0.7530, -0.7530, -0.7479],
          [-0.2165, -0.4536, -0.4536, -0.4536, -0.6331],
          [-0.2165, -0.4536, -0.4536, -0.4536, -0.6331],
          [-0.2165, -0.4536, -0.4536, -0.4536, -0.6331],
          [ 0.0494,  0.0147,  0.0147,  0.0147, -0.2564]]]],
       grad_fn=<ThnnConv2DBackward>)
>>> input
tensor([[[[1., 1., 1., 1., 1.],
          [1., 1., 1., 1., 1.],
          [1., 1., 1., 1., 1.],
          [1., 1., 1., 1., 1.],
          [1., 1., 1., 1., 1.]]]])

对于torch.nn.Conv2d()来说,传入的参数含义如下:

  • in_channels:输入特征图的通道数,如果是RGB图像,则通道数为3。卷积中的特征图通道数一般是2的整数次幂
  • out_channels:输出特征图的通道数
  • kernel_size:卷积核的尺寸,常见的有1、3、5、7
  • stride:步长,即卷积核在特征图上滑动步长,一般为1。如果大于1,则输出特征图尺寸会小于输入特征图尺寸
  • padding:填充,常见的有零填充、边缘填充等,PyTorch默认为零填充
  • dilation:空洞卷积,当大于1时可以增大感受野的同时保持特征图的尺寸,默认为1
  • groups:可实现组卷积,即在卷积操作时不是逐点卷积,而是将输入通道分为多个组,稀疏连接达到降低计算量的目的,默认为1
  • bias:是否与要偏置,默认为True

在实际使用中,特征图的维度通常都不是1,假设输入特征图维度为m×w_in×h_in,输出特征图维度为n×w_out×h_out,则卷积核的维度为n×m×k×k,在此产生的乘法操作次数为n×w_out×h_out×m×k×k

你可能感兴趣的:(PyTorch卷积神经网络)