简介

图像分类对网络结构的要求,一个是精度,另一个是速度。这两个需求推动了网络结构的发展。

  • resneXt:分组卷积,降低了网络参数个数。
  • densenet:密集的跳连接。
  • mobilenet:标准卷积分解成深度卷积和逐点卷积,即深度分离卷积。
  • SENet:注意力机制。

简单起见,使用了[1]的代码,注释掉 layer4,作为基本框架resnet14。然后改变局部结构,验证分类效果。

实验结果

GPU:gtx1070

超参数:epochs=80,lr=0.001,optim=Adam

数据集:cifar10,batch_size=100

分组卷积

# 3x3 convolution with grouping
def conv3x3(in_channels, out_channels, stride=1, groups=1):
return nn.Conv2d(in_channels, out_channels, kernel_size=3,
stride=stride, padding=1, bias=False,groups=groups)
_ 参数个数(k) GPU内存(M) 训练时间(s) 测试时间(s) 精度(%)
resnet14 195 617 665 0.34 87
分组=2 99 615 727 0.40 85
分组=4 50 615 834 0.50 81

结论:卷积分组降低了参数个数,同时也降低了速度和精度。

密集连接

    def forward(self, x): # basic block
residual = x
if self.downsample:
residual = self.downsample(x)
out = self.layer1(x)
out = self.relu(out)
out2 = self.layer2(out)
out2 = self.relu(out2)
out3 = torch.cat([out,out2],1)
out = self.layer3(out3)
out4 = self.relu(out)
out5 = torch.cat([out3,out4],1)
out = self.layer4(out5) # back to the specified channels
return out
_ 参数个数(k) GPU内存(M) 训练时间(s) 测试时间(s) 精度(%)
resnet14 195 617 665 0.34 87
密集连接 341 679 703 0.43 88

结论:参数个数和精度有所增加,速度下降一点点。

深度分离卷积

def Conv2d(in_channels, out_channels,kernel_size=1,padding=0,stride=1):
return nn.Sequential(*[
nn.Conv2d(in_channels, in_channels,kernel_size,stride=stride,padding=padding,groups=in_channels,bias=False),
nn.Conv2d(in_channels, out_channels,1,bias=False),
])
_ 参数个数(k) GPU内存(M) 训练时间(s) 测试时间(s) 精度(%)
resnet14 195 617 665 0.34 87
分组=2 99 615 727 0.40 85
分组=4 50 615 834 0.50 81
深度分离卷积 27 665 788 0.40 84

结论:深度分离卷积降低了参数个数,同时也降低了速度和精度。与分组卷积(分组=4)相比,精度要高一点。

注意力机制

利用[2]的代码,修正通道个数

    def forward(self, x): # BasicBlock
residual = x
out = self.conv1(x)
out = self.bn1(out)
out = self.relu(out)
out = self.conv2(out)
out = self.bn2(out)
if self.downsample:
residual = self.downsample(x)
# attention
original_out = out
out = F.avg_pool2d(out,out.size()[2:])
out = out.view(out.size(0), -1)
out = self.fc1(out)
out = self.relu(out)
out = self.fc2(out)
out = self.sigmoid(out)
out = out.view(out.size(0), out.size(1), 1, 1)
out = out * original_out
out += residual
out = self.relu(out)
return out
_ 参数个数(k) GPU内存(M) 训练时间(s) 测试时间(s) 精度(%)
resnet14 195 617 665 0.34 87
注意力 201 641 838 0.51 87

结论:参数个数和精度变动不大,速度降低比较明显。

引用

[1] https://github.com/yunjey/pytorch-tutorial/tree/master/tutorials/02-intermediate/deep_residual_network/main.py

[2] https://github.com/miraclewkf/SENet-PyTorch/blob/master/se_resnet.py

参考文献

  • Chollet, François. Xception: Deep Learning with Depthwise Separable Convolutions[J]. 2016.
  • Xie S , Girshick R , Dollár, Piotr, et al. Aggregated Residual Transformations for Deep Neural Networks[J]. 2016.
  • Huang G, Liu Z, Laurens V D M, et al. Densely Connected Convolutional Networks[J]. 2016.
  • Howard A G , Zhu M , Chen B , et al. MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applications[J]. 2017.
  • Hu J , Shen L , Albanie S , et al. Squeeze-and-Excitation Networks[J]. 2017.
  • https://www.cnblogs.com/liaohuiqiang/p/9691458.html

验证resneXt,densenet,mobilenet和SENet的特色结构的更多相关文章

  1. 论文笔记:CNN经典结构2(WideResNet,FractalNet,DenseNet,ResNeXt,DPN,SENet)

    前言 在论文笔记:CNN经典结构1中主要讲了2012-2015年的一些经典CNN结构.本文主要讲解2016-2017年的一些经典CNN结构. CIFAR和SVHN上,DenseNet-BC优于ResN ...

  2. JAVA WEB项目中生成验证码及验证实例(附源码及目录结构)

    [我是一个初学者,自己总结和网上搜索资料,代码是自己敲了一遍,亲测有效,现将所有的目录结构和代码贴出来分享给像我一样的初学者] 作用 验证码为全自动区分计算机和人类的图灵测试的缩写,是一种区分用户是计 ...

  3. 深度学习笔记(十一)网络 Inception, Xception, MobileNet, ShuffeNet, ResNeXt, SqueezeNet, EfficientNet, MixConv

    1. Abstract 本文旨在简单介绍下各种轻量级网络,纳尼?!好吧,不限于轻量级 2. Introduction 2.1 Inception 在最初的版本 Inception/GoogleNet, ...

  4. 从LeNet到SENet——卷积神经网络回顾

    从LeNet到SENet——卷积神经网络回顾 从 1998 年经典的 LeNet,到 2012 年历史性的 AlexNet,之后深度学习进入了蓬勃发展阶段,百花齐放,大放异彩,出现了各式各样的不同网络 ...

  5. 卷积神经网络学习笔记——SENet

    完整代码及其数据,请移步小编的GitHub地址 传送门:请点击我 如果点击有误:https://github.com/LeBron-Jian/DeepLearningNote 这里结合网络的资料和SE ...

  6. 图像分类丨ILSVRC历届冠军网络「从AlexNet到SENet」

    前言 深度卷积网络极大地推进深度学习各领域的发展,ILSVRC作为最具影响力的竞赛功不可没,促使了许多经典工作.我梳理了ILSVRC分类任务的各届冠军和亚军网络,简单介绍了它们的核心思想.网络架构及其 ...

  7. 基于jQuery的Validate表单验证

    表单验证可以说在前端开发工作中是无处不在的~ 有数据,有登录,有表单, 都需要前端验证~~  而我工作中用到最多的就是基于基于jQuery的Validate表单验证~  就向下面这样~ 因为今天有个朋 ...

  8. UART UVM验证平台平台搭建总结

    tb_top是整个UVM验证平台的最顶层:tb_top中例化dut,提供时钟和复位信号,定义接口以及设置driver和monitor的virual interface,在intial中调用run_te ...

  9. 使用Data Annotations进行手动数据验证

    Data Annotations是在Asp.Net中用于表单验证的 它通过Attribute直接标记字段的有效性,简单且直观.在非Asp.Net程序中(如控制台程序),我们也可以使用Data Anno ...

随机推荐

  1. jquery 插入节点的方法

    方法 描述 示例 append() 向每个匹配的元素内部追加内容 HTML代码: <p>我想说:</p> jQuery代码: $("p").append(& ...

  2. 2018.10.18 bzoj4105: [Thu Summer Camp 2015]平方运算(线段树)

    传送门 线段树妙题. 显然平方几次就会循环(打表证明不解释). 然后所有环长度的lcmlcmlcm不大于70. 因此维护一下当前区间中的节点是否全部在环上. 不是直接暴力到叶子节点修改. 否则整体打标 ...

  3. 2018.10.05 NOIP模拟 阶乘(简单数论)

    传送门 签到题. 直接把所有数先质因数分解. 同时统计每一个在阶乘中会出现的质数出现的最少次数. 然后对于每一个这样的质数,我们求出满足其出现质数的m的最小值,然后求出所有m的最大值. 求m的时候可以 ...

  4. Intelj IDEA的pom.xml显示错误can not reconnect

    从GitHub上边down下来的开源项目,报错莫名其妙,后来发现是跟本地hosts文件有关系 hosts文件加上 127.0.0.1 localhost 然后pom文件reload一下就

  5. C++/C头文件 .h和 .c

    在C语言家族程序中,头文件被大量使用.一般而言,每个C++/C程序通常由头文件(header files)和定义文件(definition files)组成.头文件作为一种包含功能函数.数据接口声明的 ...

  6. 在终端上创建Java项目及编译和运行

    一:实践一次这样的操作有助于理解Tomcat/Eclipse的启动原理,包括classpath的设置,option的配置等等: 二:通过Bash终端创建一个简单的Java项目(单项目单Module,如 ...

  7. Gridview的RowDataBound事件可以做很多事情

    protected void gvTest_RowDataBound(object sender, GridViewRowEventArgs e)        {            //如果是绑 ...

  8. 深浅 buffer

    var str = "深入浅出"; var buf = new Buffer(str, 'utf-8'); console.log(buf); 这种情况下是数字 var str = ...

  9. [翻译Joel On Software]选择一门语言/Choosing a language

    Joel on Software Choosing a language 选择一门语言 by Joel Spolsky Sunday, May 05,2002 Why do developerscho ...

  10. 层层递进Struts1(三)之Struts组成

    这篇博客我们来说一下Struts的主要组成我们,通过前几篇博客,我们知道这个框架最重要的几个步骤:获取路径.封装表单.获取转向列表.转向逻辑处理.转向,与此对应的是:ActionServlet.Act ...