GoogLeNet

在2014年的ImageNet图像识别挑战赛中,GeogLeNet大放异彩。GeogLeNet在名字上向LeNet致敬,其吸收了NiN中网络串联网络的思想,并在此基础上进行了改进,变成了一个串联与并联都有的网络。


Inception块

Inception块是GeogLeNet中的基础卷积块,其名字来自于同名电影《盗梦空间》(Inception)。

其包括4条并行的线路。用于抽取不同空间尺度下的特征

第一条线路抽取原始空间尺度下的信息,第二条线路使用3x3卷积核抽取较小感受野下的特征,第三条线路使用5x5卷积核抽取较大感受野下的特征,第四条线路使用3x3的最大池化层抽取特征。第二第三条线路通过使用1x1卷积层改变通道数,用以降低模型的复杂度。

4条线路都使用了合适的填充来使输入与输出的高和宽一致,最后将每条线路的输出在通道维度上连接,并输入到接下来的层中。

Inception块的定义如下:

import d2lzh as d2l
from mxnet import gluon, init, nd
from mxnet.gluon import nn
import mxnet as mx

class Inception(nn.Block):
    def __init__(self, c1, c2, c3, c4, **kwargs):
        super(Inception, self).__init__(**kwargs)
        #c1
        self.p1_1 = nn.Conv2D(c1, kernel_size=1, activation='relu')
        #c2
        self.p2_1 = nn.Conv2D(c2[0], kernel_size=1, activation='relu')
        self.p2_2 = nn.Conv2D(c2[1], kernel_size=3, padding=1, activation='relu')
        #c3
        self.p3_1 = nn.Conv2D(c3[0], kernel_size=1, activation='relu')
        self.p3_2 = nn.Conv2D(c3[1], kernel_size=5, padding=2, activation='relu')
        #c4
        self.p4_1 = nn.MaxPool2D(pool_size=3, strides=1, padding=1)
        self.p4_2 = nn.Conv2D(c4, kernel_size=1, activation='relu')
        
    def forward(self, x):
        p1 = self.p1_1(x)
        p2 = self.p2_2(self.p2_1(x))
        p3 = self.p3_2(self.p3_1(x))
        p4 = self.p4_2(self.p4_1(x))
        return nd.concat(p1, p2, p3, p4, dim=1)

GoogLeNet模型

GoogLeNet包含5个模块,b1, b2, b3, b4, b5,如下代码所示,Inception中通道数分配之比都是在ImageNet数据集上通过大量的实验得来的。GoogLeNet及后继者们一度是ImageNet上最高效的模型之一:在类似的测试进度下,他们的计算复杂度往往更低。

b1 = nn.Sequential()
b1.add(nn.Conv2D(64, kernel_size=7, strides=2, padding=3, activation='relu'),
       nn.MaxPool2D(pool_size=3, strides=2, padding=1))
b2 = nn.Sequential()
b2.add(nn.Conv2D(64, kernel_size=1, activation='relu'),
       nn.Conv2D(192, kernel_size=3, padding=1, activation='relu'),
       nn.MaxPool2D(pool_size=3, strides=2, padding=1))
b3 = nn.Sequential()
b3.add(Inception(64, (96, 128), (16, 32), 32),
       Inception(128, (128, 192), (32, 96), 64),
       nn.MaxPool2D(pool_size=3, strides=2, padding=1))
b4 = nn.Sequential()
b4.add(Inception(192, (96, 208), (16, 48), 64),
       Inception(160, (112, 224), (24, 64), 64),
       Inception(128, (128, 256), (24, 64), 64),
       Inception(112, (144, 288), (32, 64), 64),
       Inception(256, (160, 320), (32, 128), 128),
       nn.MaxPool2D(pool_size=3, strides=2, padding=1))
b5 = nn.Sequential()
b5.add(Inception(256, (160, 320), (32, 128), 128),
       Inception(384, (192, 384), (48, 128), 128),
       nn.GlobalAvgPool2D()) # 平均池化层将每个通道的高和宽变成1,即将通道数变味了特征数

net = nn.Sequential()
net.add(b1, b2, b3, b4, b5, nn.Dense(10)) # 这里别忘了加上Dense层分成10个类

lr, num_epochs, batch_size, ctx = 0.1, 5, 128, mx.cpu()
net.initialize(force_reinit=True, ctx=ctx, init=init.Xavier())
trainer = gluon.Trainer(net.collect_params(), 'sgd', {'learning_rate': lr})
train_iter, test_iter = d2l.load_data_fashion_mnist(batch_size, resize=96)
d2l.train_ch5(net, train_iter, test_iter, batch_size, trainer, ctx, num_epochs)

参考文献:

《动手学深度学习》——阿斯顿张、李沐

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值