• pytorch搭建squeezenet网络的整套工程(升级版)


    上一篇当中,使用pytorch搭建了一个squeezenet,效果还行。但是偶然间发现了一个稍微改动的版本,拿来测试一下发现效果会更好,大概网络结构还是没有变,还是如下的第二个版本:
    在这里插入图片描述
    具体看网络结构代码:

    import torch
    import torch.nn as nn
    
    
    class Fire(nn.Module):
    
        def __init__(self, in_channel, out_channel, squzee_channel):
    
            super().__init__()
            self.squeeze = nn.Sequential(
                nn.Conv2d(in_channel, squzee_channel, 1),
                nn.BatchNorm2d(squzee_channel),
                nn.ReLU(inplace=True)
            )
    
            self.expand_1x1 = nn.Sequential(
                nn.Conv2d(squzee_channel, int(out_channel / 2), 1),
                nn.BatchNorm2d(int(out_channel / 2)),
                nn.ReLU(inplace=True)
            )
    
            self.expand_3x3 = nn.Sequential(
                nn.Conv2d(squzee_channel, int(out_channel / 2), 3, padding=1),
                nn.BatchNorm2d(int(out_channel / 2)),
                nn.ReLU(inplace=True)
            )
    
        def forward(self, x):
    
            x = self.squeeze(x)
            x = torch.cat([
                self.expand_1x1(x),
                self.expand_3x3(x)
            ], 1)
    
            return x
    
    class SqueezeNet(nn.Module):
    
        """mobile net with simple bypass"""
        def __init__(self, class_num=100):
    
            super().__init__()
            self.stem = nn.Sequential(
                nn.Conv2d(3, 96, 3, padding=1),
                nn.BatchNorm2d(96),
                nn.ReLU(inplace=True),
                nn.MaxPool2d(2, 2)
            )
    
            self.fire2 = Fire(96, 128, 16)
            self.fire3 = Fire(128, 128, 16)
            self.fire4 = Fire(128, 256, 32)
            self.fire5 = Fire(256, 256, 32)
            self.fire6 = Fire(256, 384, 48)
            self.fire7 = Fire(384, 384, 48)
            self.fire8 = Fire(384, 512, 64)
            self.fire9 = Fire(512, 512, 64)
    
            self.conv10 = nn.Conv2d(512, class_num, 1)
            self.avg = nn.AdaptiveAvgPool2d(1)
            self.maxpool = nn.MaxPool2d(2, 2)
    
        def forward(self, x):
            x = self.stem(x)
    
            f2 = self.fire2(x)
            f3 = self.fire3(f2) + f2
            f4 = self.fire4(f3)
            f4 = self.maxpool(f4)
    
            f5 = self.fire5(f4) + f4
            f6 = self.fire6(f5)
            f7 = self.fire7(f6) + f6
            f8 = self.fire8(f7)
            f8 = self.maxpool(f8)
    
            f9 = self.fire9(f8)
            c10 = self.conv10(f9)
    
            x = self.avg(c10)
            # x = x.view(x.size(0), -1)
            x = torch.flatten(x, start_dim=1)
    
            return x
    
    def squeezenet(class_num=100):
        return SqueezeNet(class_num=class_num)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88

    最大的变化就是在卷积层和relu激活层之间加了个bn层,包括所有的fire结构内。其余就是卷积和池化的kernel_size或stride的微调,包括最后去掉了dropout,以及最后部分的网络结构也稍作调整:
    在这里插入图片描述
    将这个网络结构与上一个的网络结构训练同一训练集,得到的模型测试同一测试集,发现这个模型的准确率会比上一个高几个点。而且上一个模型训练容易不稳定,训练到一半直接梯度爆炸了,需要不断调参也比较麻烦,这个模型lr直接0.1或0.01都能训练很好,所以个人更推荐这个网络模型。
    下一篇编辑此网络结构的caffe版本

  • 相关阅读:
    【ARM Coresight 系列文章 9 -- ETM 介绍 1】
    c# 逆变 / 协变
    c++ builder 6.0 使用 Programming with DB-Library for C
    在SpringBoot下,tomcat的运行模式:BIO、NIO、APR
    Jmeter实现在请求param和body里面加入随机参数
    网络运维的挑战与解决方案:塑造无缝、高效的IT环境
    阿里云幻兽帕鲁服务器操作系统类型怎么选择?
    MacOS安装conda
    二、Prometheus常用exporter安装详解
    虚拟摄像头之四: 谁在调用 v4l2_camera_HAL 摄像头驱动
  • 原文地址:https://blog.csdn.net/weixin_45354497/article/details/134303632