常用的神经网络结构

记录一些神经网络结构,先占个坑。。。

1.resnet:Deep Residual Learning for Image Recognition

Deep Residual Learning for Image Recognition
论文链接:https://arxiv.org/pdf/1512.03385.pdf
网络结构:
在这里插入图片描述
在这里插入图片描述
注意点

  • 每经过一个conv_x 都会被下采样一次,除了conv2_x的下采样是由max pool完成,其他的都是由第一个Bottleneck(比如conv3_x是由4个Bottleneck组成)中的第一个conv的stride设置为2完成,比如在conv3_x就是由第一个1 * 1 128的 conv的stride设置为2,残差连接也发生在第一个Bottleneck,Bottleneck中的第二个conv 3*3 的padding设置为1来弥补从而不产生stride。
  • resnet中的所有conv的bias都被设置为了false,主要是因为在每个conv后都会接上bn,而bn可以起到这个bias的效果,其实这个操作在其他的网络结构中也很常见,比如SEnet等 参考
  • 有时候可以将最后一个conv5_x的第一个Bottleneck的第一个conv 1 * 1 的stride设置为1,所有Bottleneck的第二个conv 3 * 3 的dilation设置为2,作为空洞卷积,从而保证conv5_x虽然不增加stride但是仍然扩大了感受野
  • pytorch版本与caffe版本的resnet结构是不一样的,区别在于: If style is “pytorch”, the stride-two layer is the 3x3 conv layer, if it is “caffe”, the stride-two layer is the first 1x1 conv layer.也就是说stride为2的conv位置不同,pytorch在每个Bottleneck的33conv,而caffe在每个Bottleneck的第一个11conv位置,记得原来看AlexNet的时候pytorch版本也与caffe版本有所不同

2. resnext: Aggregated Residual Transformations for Deep Neural Networks

Aggregated Residual Transformations for Deep Neural Networks
论文链接:https://arxiv.org/pdf/1611.05431v2.pdf

在这里插入图片描述
每个Bottleneck结构图
在这里插入图片描述
其中resneXt50-32*4d中的32就是指totol 32 paths,4指的是宽度,即每条path的第一个conv的out_channel.
作者通过实验发现以下三种形式是等价的
在这里插入图片描述
所以在代码实现中就直接采用的图©的形式,主要是更加简洁而且速度更快,其实就是组卷积(分组卷积(Group Convolution)与深度可分离卷积(Depthwise Separable Convolution)),在pytorch中直接通过设置conv的group参数即可

3. Resnest:Split-Attention Networks

ResNeSt: Split-Attention Networks
论文链接:https://hangzhang.org/files/resnest.pdf
代码:https://github.com/zhanghang1989/ResNeSt
对resnet进一步改进,resnest中的s应该代表Split-Attention[code],结构图如下图
在这里插入图片描述
其实就是基于 SENet,SKNet(计算机视觉(CV)中的注意力Attention机制 )和 ResNeXt,把 attention 做到 group level。仿照resnext中cardinal的概念将SKNet 多分支不易模块化做的更加易用一些,可以看出sknet多分支的一种特殊情况,即kernel都是相同的。
实际上在代码中为了方便与检测与分割任务,cardinal取值为1,split r取值为2
resnest-50的结构图:gist
从网络结构中看(这些在文中中4.1 Network Tweaks可以看到),与resnext的区别:

  • 第一个conv从单纯的conv 7*7换成了
(conv1): Sequential(
    (0): Conv2d(3, 64, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1), bias=False)
    (1): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
    (2): ReLU(inplace)
    (3): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
    (4): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
    (5): ReLU(inplace)
    (6): Conv2d(64, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
  )
  • 每个layer1的第一个Bottleneck的第一个conv之后利用AvgPool2d(kernel_size=3, stride=2, padding=1)进行下采样,文中描述为采用原来的conv 3*3 stride=2会损失空间信息,shortcut的downsample是采用AvgPool2d(kernel_size=2, stride=2, padding=0)来进行的(第一个layer除外),
  • Split-Attention用在每个layer中的每个Bottleneck的第二个conv即conv2

猜你喜欢

转载自blog.csdn.net/breeze_blows/article/details/104142200