经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 大数据/云/AI » 人工智能基础 » 查看文章
比较 VGG, resnet和inception的图像分类效果
来源:cnblogs  作者:yunfeng_net  时间:2019/2/25 9:11:03  对本文有异议

简介

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很重要

代码改动

  1. class ResNet(nn.Module):
  2. def __init__(self, block, layers, num_classes=10):
  3. super(ResNet, self).__init__()
  4. self.in_channels = 16
  5. self.conv = conv3x3(3, 16)
  6. self.bn = nn.BatchNorm2d(16)
  7. self.relu = nn.ReLU(inplace=True)
  8. self.layer1 = self.make_layer(block, 16, layers[0])
  9. self.layer2 = self.make_layer(block, 32, layers[1], 2)
  10. self.layer3 = self.make_layer(block, 64, layers[2], 2)
  11. self.avg_pool = nn.AvgPool2d(8)
  12. self.fc = nn.Linear(64, num_classes)
  13. print('# generator parameters:', sum(param.numel() for param in model.parameters()))
  1. class VGG(nn.Module):
  2. def __init__(self, features, num_classes=10, init_weights=True):
  3. super(VGG, self).__init__()
  4. self.features = features
  5. self.avgpool = nn.AdaptiveAvgPool2d((3, 3))
  6. self.classifier = nn.Sequential(
  7. nn.Linear(9 * 8 * 8, 64),
  8. nn.ReLU(True),
  9. #nn.Dropout(),
  10. nn.Linear(64, 64),
  11. nn.ReLU(True),
  12. #nn.Dropout(),
  13. nn.Linear(64, num_classes),
  14. )
  15. def vgg_bn(**kwargs):
  16. cfg = [16, 16, 'M', 32, 32, 'M', 32, 32, 'M', 64, 64, 'M', 64, 64, 'M']
  17. model = VGG(make_layers(cfg, batch_norm=True), **kwargs)
  1. class Inception_v1(nn.Module):
  2. def __init__(self, num_classes=10):
  3. super(Inception_v1, self).__init__()
  4. #conv2d0
  5. self.conv1 = conv3x3(3, 6)
  6. self.max_pool1 = nn.MaxPool2d(kernel_size=3, stride=2, padding=1)
  7. self.lrn1 = nn.BatchNorm2d(6)
  8. self.inception_3a = Inception_base(1, 6, [[16], [16,32], [8, 16], [3, 16]]) #3a
  9. self.inception_3b = Inception_base(1, 80, [[40], [32,48], [12, 16], [3, 16]]) #3b
  10. self.max_pool_inc3= nn.MaxPool2d(kernel_size=3, stride=2, padding=0)
  11. self.inception_5a = Inception_base(1, 120, [[40], [32,48], [12, 16], [3, 16]]) #5a
  12. self.inception_5b = Inception_base(1, 120, [[40], [32,48], [12, 16], [3, 16]]) #5b
  13. self.avg_pool5 = nn.AvgPool2d(kernel_size=3, stride=2, padding=0)
  14. self.dropout_layer = nn.Dropout(0.4)
  15. 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

原文链接:http://www.cnblogs.com/liuyunfeng/p/10427860.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号