比较 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 ...
随机推荐
- 【转】Java学习---快速掌握RPC原理及实现
[原文]https://www.toutiao.com/i6592365493435236872/ RPC概述 RPC(Remote Procedure Call)即远程过程调用,也就是说两台服务器 ...
- springmvc 笔记一
Springmvc 处理流程 所需的包 前端配置器 在web.xml中配置 <!-- 配置前端控制器 --> <servlet> <servlet-name>spr ...
- tp查询顺序
tp竟然可以跟据商品的id来进行排序查询的数据 记一些php中排序: sort()方法一维索引数组进行值升序排序 rsort()方法一维索引数组进行值降序排序 unsort()方法负责编写自定义排序操 ...
- django模板系统(下)
主要内容:母版,继承母版,块,组件,静态文件 母版 <!DOCTYPE html> <html lang="en"> <head> <me ...
- sublime设置node.js编译
1. 首先需安装node环境并配置好环境变量,安装教程. 2. 然后在sublime中打开工具(Tools)→编译系统(Build System)→新编译系统(New Build System) 3. ...
- python第三十一课--递归(2.遍历某个路径下面的所有内容)
需求:遍历某个路径下面的所有内容(文件和目录,多层级的) import os #自定义函数(递归函数):遍历目录层级(多级) def printDirs(path): dirs=os.listdir( ...
- 关于ip判断
php正则实现ip段判断 $ip = '22.18.10.2'; $arrayip = array('123.12.*.*','22.18.10.*');//ip段 $ipregexp = implo ...
- 谈谈HTTP
HTTP又称超文本传输协议,在互联网上广为流传和应用. 今天主要讲这么几个? a.针对HTTP下细分为: HTTP概念.Request和Response详解.Request中GET和POST的区别.说 ...
- VS2015+OpenGL4.0开发编译时弹出错误:glaux.lib(tk.obj) : error LNK2019: 无法解析的外部符号 _sscanf,该符号在函数 _GetRegistrySysColors@8 中被引用
一.问题描述: VS2015+OpenGL4.0开发编译时弹出如下所示的错误: 1>glaux.lib(tk.obj) : error LNK2019: 无法解析的外部符号 _sscanf,该符 ...
- CSS属性书写顺序及命名规则
/* mozilla.org Base Styles * maintained by fantasai */ /* Suggested order: * display * list-style * ...