比较 VGG, resnet和inception的图像分类效果
简介
VGG, resnet和inception是3种典型的卷积神经网络结构。
- VGG采用了3*3的卷积核,逐步扩大通道数量
- resnet中,每两层卷积增加一个旁路
- inception实现了卷积核的并联,然后把各自通道拼接到一起
简单起见,直接使用了[1]的代码来测试 resnet,然后用[2],[4]的代码替换[1]中的model,改了改通道,测 VGG 和 inception。
GPU是gtx1050,主板开始是 x79,后来坏了,换成 x470,GPU占比提高很多。
CPU占比始终100%
实验结果
超参数:epochs=80,lr=0.001,optim=Adam
数据集:cifar10
_ | 参数个数(k) | 训练时间(m) | 精度(%) | GPU内存(M) | GPU占比(%) |
---|---|---|---|---|---|
resnet | 195 | 22 | 88 | 607 | 99 |
vgg_bn | 207 | 17 | 84 | 535 | 60 |
inception | 107 | 19 | 80 | 613 | 98 |
结论:条条道路通罗马。
附加实验
因为方便,注释掉 Batch Normalization,以及 Data Augmentation 又试了两次。
_ | 参数个数(k) | 训练时间(m) | 精度(%) | GPU内存(M) | GPU占比(%) |
---|---|---|---|---|---|
resnet | 195 | 22 | 88 | 607 | 99 |
resnet-BN | 195 | 19 | 86 | 553 | 99 |
resnet-DA | 195 | 22 | 64 | 607 | 99 |
结论:Data Augmentation很重要
代码改动
class ResNet(nn.Module):
def __init__(self, block, layers, num_classes=10):
super(ResNet, self).__init__()
self.in_channels = 16
self.conv = conv3x3(3, 16)
self.bn = nn.BatchNorm2d(16)
self.relu = nn.ReLU(inplace=True)
self.layer1 = self.make_layer(block, 16, layers[0])
self.layer2 = self.make_layer(block, 32, layers[1], 2)
self.layer3 = self.make_layer(block, 64, layers[2], 2)
self.avg_pool = nn.AvgPool2d(8)
self.fc = nn.Linear(64, num_classes)
print('# generator parameters:', sum(param.numel() for param in model.parameters()))
class VGG(nn.Module):
def __init__(self, features, num_classes=10, init_weights=True):
super(VGG, self).__init__()
self.features = features
self.avgpool = nn.AdaptiveAvgPool2d((3, 3))
self.classifier = nn.Sequential(
nn.Linear(9 * 8 * 8, 64),
nn.ReLU(True),
#nn.Dropout(),
nn.Linear(64, 64),
nn.ReLU(True),
#nn.Dropout(),
nn.Linear(64, num_classes),
)
def vgg_bn(**kwargs):
cfg = [16, 16, 'M', 32, 32, 'M', 32, 32, 'M', 64, 64, 'M', 64, 64, 'M']
model = VGG(make_layers(cfg, batch_norm=True), **kwargs)
class Inception_v1(nn.Module):
def __init__(self, num_classes=10):
super(Inception_v1, self).__init__()
#conv2d0
self.conv1 = conv3x3(3, 6)
self.max_pool1 = nn.MaxPool2d(kernel_size=3, stride=2, padding=1)
self.lrn1 = nn.BatchNorm2d(6)
self.inception_3a = Inception_base(1, 6, [[16], [16,32], [8, 16], [3, 16]]) #3a
self.inception_3b = Inception_base(1, 80, [[40], [32,48], [12, 16], [3, 16]]) #3b
self.max_pool_inc3= nn.MaxPool2d(kernel_size=3, stride=2, padding=0)
self.inception_5a = Inception_base(1, 120, [[40], [32,48], [12, 16], [3, 16]]) #5a
self.inception_5b = Inception_base(1, 120, [[40], [32,48], [12, 16], [3, 16]]) #5b
self.avg_pool5 = nn.AvgPool2d(kernel_size=3, stride=2, padding=0)
self.dropout_layer = nn.Dropout(0.4)
self.fc = nn.Linear(120*9, num_classes)
引用
[1] https://github.com/yunjey/pytorch-tutorial/tree/master/tutorials/02-intermediate/deep_residual_network/main.py
[2] https://github.com/pytorch/vision/blob/master/torchvision/models/vgg.py
[3] https://github.com/pytorch/vision/blob/master/torchvision/models/resnet.py
[4] https://github.com/antspy/inception_v1.pytorch/blob/master/inception_v1.py
比较 VGG, resnet和inception的图像分类效果的更多相关文章
- NASNet学习笔记—— 核心一:延续NAS论文的核心机制使得能够自动产生网络结构; 核心二:采用resnet和Inception重复使用block结构思想; 核心三:利用迁移学习将生成的网络迁移到大数据集上提出一个new search space。
from:https://blog.csdn.net/xjz18298268521/article/details/79079008 NASNet总结 论文:<Learning Transfer ...
- 学习TensorFlow,调用预训练好的网络(Alex, VGG, ResNet etc)
视觉问题引入深度神经网络后,针对端对端的训练和预测网络,可以看是特征的表达和任务的决策问题(分类,回归等).当我们自己的训练数据量过小时,往往借助牛人已经预训练好的网络进行特征的提取,然后在后面加上自 ...
- Keras入门(五)搭建ResNet对CIFAR-10进行图像分类
本文将会介绍如何利用Keras来搭建著名的ResNet神经网络模型,在CIFAR-10数据集进行图像分类. 数据集介绍 CIFAR-10数据集是已经标注好的图像数据集,由Alex Krizhe ...
- 论文笔记:CNN经典结构1(AlexNet,ZFNet,OverFeat,VGG,GoogleNet,ResNet)
前言 本文主要介绍2012-2015年的一些经典CNN结构,从AlexNet,ZFNet,OverFeat到VGG,GoogleNetv1-v4,ResNetv1-v2. 在论文笔记:CNN经典结构2 ...
- 图像分类丨Inception家族进化史「GoogleNet、Inception、Xception」
引言 Google提出的Inception系列是分类任务中的代表性工作,不同于VGG简单地堆叠卷积层,Inception重视网络的拓扑结构.本文关注Inception系列方法的演变,并加入了Xcept ...
- 1、VGG16 2、VGG19 3、ResNet50 4、Inception V3 5、Xception介绍——迁移学习
ResNet, AlexNet, VGG, Inception: 理解各种各样的CNN架构 本文翻译自ResNet, AlexNet, VGG, Inception: Understanding va ...
- 深度学习笔记(十一)网络 Inception, Xception, MobileNet, ShuffeNet, ResNeXt, SqueezeNet, EfficientNet, MixConv
1. Abstract 本文旨在简单介绍下各种轻量级网络,纳尼?!好吧,不限于轻量级 2. Introduction 2.1 Inception 在最初的版本 Inception/GoogleNet, ...
- PyTorch ResNet 使用与源码解析
本章代码:https://github.com/zhangxiann/PyTorch_Practice/blob/master/lesson8/resnet_inference.py 这篇文章首先会简 ...
- 【深度学习】keras + tensorflow 实现猫和狗图像分类
本文主要是使用[监督学习]实现一个图像分类器,目的是识别图片是猫还是狗. 从[数据预处理]到 [图片预测]实现一个完整的流程, 当然这个分类在 Kaggle 上已经有人用[迁移学习](VGG,Resn ...
随机推荐
- Python学习--打码平台
打码平台介绍 作用:可以通过第三方平台进行智能识别或者人工识别图片. 优点:1. 价格便宜: 2. 使用简单: 3. 识别率高 平台介绍: - 云打码(推荐) [http://www.yundama. ...
- 高斯消去、追赶法 matlab
1. 分别用Gauss消去法.列主元Gauss消去法.三角分解方法求解方程组 程序: (1)Guess消去法: function x=GaussXQByOrder(A,b) %Gauss消去法 N = ...
- [BZOJ 3167][HEOI 2013]SAO
[BZOJ 3167][HEOI 2013]SAO 题意 对一个长度为 \(n\) 的排列作出 \(n-1\) 种限制, 每种限制形如 "\(x\) 在 \(y\) 之前" 或 & ...
- Symbol Table Applications
符号表应用 在计算机发展的早期,符号表帮助程序员从使用机器语言的数字地址进化到在汇编语言中使用符号名称:在现代应用程序中,符号名称的含义能够通行于跨域全球的计算机网络.快速查找算法曾经并继续在计算机领 ...
- leetcode 3. Longest Substring Without Repeating Characters [java]
idea: 设置一个hashset存储非重复元素 j:遍历s i:最近的一个非重复指针 注意点: 1.Set set = new HashSet<>(); add remove publi ...
- jQuery 实现复选框的全选与反选
<script> //实现全选与反选 $(".allAndNotAll").click(function () { if ($(this).prop("che ...
- 11.C++和C的区别,什么是面向对象
c++封装更好,调用接口,c调用子函数 1.首先C和C++在基础语句上没有太大区别,c++在c基础上改进,兼容大部分c的语法结构.c++面向对象,c面向过程. 2.新增new和delete的语法,引用 ...
- 青岛大学开源OJ平台搭建
源码地址为:https://github.com/QingdaoU/OnlineJudge 可参考的文档为:https://github.com/QingdaoU/OnlineJudgeDeploy/ ...
- Linux中Shell
Linux中Shell Shell是什么 Shell是一个命令行解释器,为用户提供了一个向Linux内核发送请求以便运行程序的界面系统级程序,可以用Shell来启动.挂起.停止.编写一些程序. S ...
- zabbix items 配置
item是什么?它是我们对于host监控的基本条目,它属于不同的applications中,item的设置既可以针对具体的某个host主机,也可以针对模板进行设定(可以在多个主机进行复用). item ...