验证resneXt,densenet,mobilenet和SENet的特色结构
简介
图像分类对网络结构的要求,一个是精度,另一个是速度。这两个需求推动了网络结构的发展。
- 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的特色结构的更多相关文章
- 论文笔记:CNN经典结构2(WideResNet,FractalNet,DenseNet,ResNeXt,DPN,SENet)
前言 在论文笔记:CNN经典结构1中主要讲了2012-2015年的一些经典CNN结构.本文主要讲解2016-2017年的一些经典CNN结构. CIFAR和SVHN上,DenseNet-BC优于ResN ...
- JAVA WEB项目中生成验证码及验证实例(附源码及目录结构)
[我是一个初学者,自己总结和网上搜索资料,代码是自己敲了一遍,亲测有效,现将所有的目录结构和代码贴出来分享给像我一样的初学者] 作用 验证码为全自动区分计算机和人类的图灵测试的缩写,是一种区分用户是计 ...
- 深度学习笔记(十一)网络 Inception, Xception, MobileNet, ShuffeNet, ResNeXt, SqueezeNet, EfficientNet, MixConv
1. Abstract 本文旨在简单介绍下各种轻量级网络,纳尼?!好吧,不限于轻量级 2. Introduction 2.1 Inception 在最初的版本 Inception/GoogleNet, ...
- 从LeNet到SENet——卷积神经网络回顾
从LeNet到SENet——卷积神经网络回顾 从 1998 年经典的 LeNet,到 2012 年历史性的 AlexNet,之后深度学习进入了蓬勃发展阶段,百花齐放,大放异彩,出现了各式各样的不同网络 ...
- 卷积神经网络学习笔记——SENet
完整代码及其数据,请移步小编的GitHub地址 传送门:请点击我 如果点击有误:https://github.com/LeBron-Jian/DeepLearningNote 这里结合网络的资料和SE ...
- 图像分类丨ILSVRC历届冠军网络「从AlexNet到SENet」
前言 深度卷积网络极大地推进深度学习各领域的发展,ILSVRC作为最具影响力的竞赛功不可没,促使了许多经典工作.我梳理了ILSVRC分类任务的各届冠军和亚军网络,简单介绍了它们的核心思想.网络架构及其 ...
- 基于jQuery的Validate表单验证
表单验证可以说在前端开发工作中是无处不在的~ 有数据,有登录,有表单, 都需要前端验证~~ 而我工作中用到最多的就是基于基于jQuery的Validate表单验证~ 就向下面这样~ 因为今天有个朋 ...
- UART UVM验证平台平台搭建总结
tb_top是整个UVM验证平台的最顶层:tb_top中例化dut,提供时钟和复位信号,定义接口以及设置driver和monitor的virual interface,在intial中调用run_te ...
- 使用Data Annotations进行手动数据验证
Data Annotations是在Asp.Net中用于表单验证的 它通过Attribute直接标记字段的有效性,简单且直观.在非Asp.Net程序中(如控制台程序),我们也可以使用Data Anno ...
随机推荐
- PLSQL导入导出表的正确步骤
PLSQL导入导出表的正确步骤 原来总是直接 tools->import talbes->Oracle Import结果发现有的时候会出错:有的表不能正确导入, 导出步骤: 1 tools ...
- const当做标记的函数重载,但是仅仅是限于类里面的成员函数
(1)我们知道函数的重载时根据函数的参数类型以及函数参数个数来重载的,不能用函数返回值来重载函数.但是有时候函数参数个数和函数参数类型重载函数会和默认参数发生冲突: int fun(int i,cha ...
- Unable to load tag handler class "com.showId.Id.ShowId" for tag "ShowId:ShowId"] with root cause错误的解决方案
严重: Servlet.service() for servlet [jsp] in context with path [/Biaoqian] threw exception [/1.jsp (l ...
- 基础的linux学习
学习了这几个命令分享一下: 文本文件内搜索数据 grep -n -e pattern1 -e pattern2 file1 -n 搜索到的数据显示行号展示 -e pattern1 多个匹配模式下可以通 ...
- Restful风格wcf调用4——权限认证
写在前面 在前面的三篇文章,已经介绍了restful风格wcf,如何实现增删改查以及文件的上传下载操作.本篇文章将介绍一下,调用restful的权限认证的内容.在调用的接口,为了安全,总会需要对请求进 ...
- 保留注释换行的python模块configparser
python语言用来解析配置文件的模块是ConfigParser,python3中是configparser模块,我在使用中发现write方法在将配置项重新写入文 件时,配置文件中的空行和注释行都会被 ...
- 【TypeScript】TypeScript 学习 2——接口
在 TypeScript 中,接口是用作约束作用的,在编译成 JavaScript 的时候,所有的接口都会被擦除掉,因为 JavaScript 中并没有接口这一概念. 先看看一个简单的例子: func ...
- WPF中得到一个控件相对其他控件的坐标
加入想得到按钮btnTest左上角相对于主窗体winTest的坐标,可以用如下方法:btnTest.TranslatePoint(new Point(0, 0), winTest)这个方法返回一个Po ...
- JavaScript中Ajax的使用
AJAX全称为“Asynchronous javascript and XML”(异步javascript和XML),是指一种创建交互式网页应用的网页开发技术.通过在后台与服务器进行少量数据交换,AJ ...
- C++ - explicit和volatile/const的内容
第一眼见到explicit和volatile可能会一愣一愣的觉得可能是c11或者c14新加的标识符. 其实不是这样,volatile和const两个关键字在C语言的第二个版本KR C的时候就被加入了C ...