100天深度学习-PartA:Week1-day5 GoogLeNet

AI基础 经典网络  收藏
0 / 865

05---副本-(2).png
05.png

简介

GoogLeNet,采用InceptionModule和全局平均池化层,构建了一个22层的深度网络,使得很好地控制计算量和参数量的同时( AlexNet 参数量的1/12),获得了非常好的分类性能. 它获得2014年ILSVRC挑战赛冠军,将Top5 的错误率降低到6.67%.

GoogLeNet这个名字也是挺有意思的,将L大写,为了向开山鼻祖的LeNet网络致敬

基本信息

论文 Going deeper with convolutions.

paper :http://www.cv-foundation.org/openaccess/content_cvpr_2015/papers/Szegedy_Going_Deeper_With_2015_CVPR_paper.pdf

作者 Szegedy, Christian, et al

发表于 2015年 CVPR(Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition)

翻译 http://www.aiqianji.com/blog/article/25

创新点

GoogLeNet的网络结构设计很大程度上借鉴了2014年 ICLR 的paper:Network In Network。

它打破了常规的卷积层串联的模式,精心设计了InceptionModule,提高了参数的利用效率,完成了22层的模型。

此外,它最后的全连接层也是用全局平均池化层来取代。

Inception 这一名字来自于科幻电影《盗梦空间》。

网络结构

GoogLeNet 原始结构如图:
googlenet-nologo.png

googlenet_th.jpeg

inceptionmodule.png

将InceptionModule 提取出来之后,可以将模型抽象如图

05---副本-(3).png

每个InceptionModule 是两层结构:

05---副本---副本.png

源码

tensorflow 源码 https://github.com/tensorflow/models/tree/master/research/slim/nets/inception_v1.py

caffe https://github.com/BVLC/caffe/blob/master/models/bvlc_googlenet/train_val.prototxt

pytorch :https://github.com/pytorch/vision/blob/master/torchvision/models/googlenet.py

练习:在32*32 的 cifar10 上进行十分类,用pytorch构建网络结构

手写示例:

class Inception(nn.Module):
    def __init__(self, in_planes, kernel_1_x, kernel_3_in, kernel_3_x, kernel_5_in, kernel_5_x, pool_planes):
        super(Inception, self).__init__()
        # 1x1 conv branch
        self.b1 = nn.Sequential(
            nn.Conv2d(in_planes, kernel_1_x, kernel_size=1),
            nn.BatchNorm2d(kernel_1_x),
            nn.ReLU(True),
        )

        # 1x1 conv -> 3x3 conv branch
        self.b2 = nn.Sequential(
            nn.Conv2d(in_planes, kernel_3_in, kernel_size=1),
            nn.BatchNorm2d(kernel_3_in),
            nn.ReLU(True),
            nn.Conv2d(kernel_3_in, kernel_3_x, kernel_size=3, padding=1),
            nn.BatchNorm2d(kernel_3_x),
            nn.ReLU(True),
        )

        # 1x1 conv -> 5x5 conv branch
        self.b3 = nn.Sequential(
            nn.Conv2d(in_planes, kernel_5_in, kernel_size=1),
            nn.BatchNorm2d(kernel_5_in),
            nn.ReLU(True),
            nn.Conv2d(kernel_5_in, kernel_5_x, kernel_size=3, padding=1),
            nn.BatchNorm2d(kernel_5_x),
            nn.ReLU(True),
            nn.Conv2d(kernel_5_x, kernel_5_x, kernel_size=3, padding=1),
            nn.BatchNorm2d(kernel_5_x),
            nn.ReLU(True),
        )

        # 3x3 pool -> 1x1 conv branch
        self.b4 = nn.Sequential(
            nn.MaxPool2d(3, stride=1, padding=1),
            nn.Conv2d(in_planes, pool_planes, kernel_size=1),
            nn.BatchNorm2d(pool_planes),
            nn.ReLU(True),
        )

    def forward(self, x):
        y1 = self.b1(x)
        y2 = self.b2(x)
        y3 = self.b3(x)
        y4 = self.b4(x)
        return torch.cat([y1,y2,y3,y4], 1)

结果:
GoogLeNet : BEST ACC. PERFORMANCE: 92.860%