GoogLeNet理解及Tensorflow实现

本文详细介绍了GoogLeNet网络结构,包括Inception Module的设计理念,如降低参数量、Hebbian原理的应用。GoogLeNet通过Inception家族的进化,如Inception V2、V3和V4,不断提升准确率和效率。文章还提供了TensorFlow实现Inception V3的示例,总结了Inception Net的设计思想和技巧。
摘要由CSDN通过智能技术生成

1. 介绍

GoogLeNet首次出现在ILSVRC 2014的比赛中(Inception V1),就以较大优势取得了第一名(top-5错误率6.67%,VGGNet—7.32%)。GoogLeNet有22层深,比[AlexNet]的8层和[VGGNet]的19层还要深。但是GoogLeNet只有500万的参数数量,是AlexNet的1/12(但远胜于AlexNet的准确率),VGGNet的参数是AlexNet的3倍,在内存或计算资源有限时,GoogLeNet是比较好的选择。

降低参数的目的

  1. 参数越多模型越庞大,需要提供模型学习的数据量就越大,而目前高质量的数据非常昂贵;
  2. 参数越多,耗费的计算资源也会更大。

创新点

  1. 去除了最后的全连接层,用全局平均池化层(将图片尺寸变为 1 × 1 1\times1 1×1)来取代它。 → \rightarrow 全连接层几乎占据了AlexNet或VGGNet中的90%的参数量,而且会引起过拟合,去除全连接层后模型训练更快并且减轻了过拟合。(该想法借鉴了Network In Network中的思想)
  2. 利用Inception Module提高参数的利用效率。
    在这里插入图片描述
图1. Inception Module结构图

Inception Module的基本结构
4个分支,通过 1 × 1 1\times1 1×1卷积来进行低成本的跨通道的特征变换。

  • 分支1:对输入进行 1 × 1 1\times1 1×1的卷积,能够跨通道组织信息,提高网络的表达能力,同时可以对输出通道升维和降维;
  • 分支2:先使用 1 × 1 1\times1 1×1卷积,然后连接 3 × 3 3\times3 3×3卷积,相当于进行了两次特征变换;
  • 分支3:先 1 × 1 1\times1 1×1卷积,然后连接 5 × 5 5\times5 5×5卷积;
  • 分支4:先 3 × 3 3\times3 3×3最大池化,后 1 × 1 1\times1 1×1卷积, 1 × 1 1\times1 1×1卷积的性价比很高,用很小的计算量就能增加一层特征变换和非线性化。

Inception Module可以让网络的深度和宽度高效率的扩充,提升准确率且不至于过拟合。

Hebbian原理

人脑神经元的连接是稀疏的,因此研究者认为大型神经网络的合理的连接方式应该也是稀疏的(对于非常大型、非常深的神经网络,可以减轻过拟合并降低计算量)。文中提到的稀疏结构基于Hebbian原理。

Hebbian原理: 神经反射活动的持续和重复会导致神经元连接稳定性的持久提升,当两个神经元细胞A和B距离很近,并且A参与了对B重复、持续的兴奋,那么某些代谢变化会导致A将作为能使B兴奋的细胞。如图2所示,将上一层高度相关(correlated)的的节点聚类,并将聚类出来的每一个小簇(cluster)连接到一起。
在这里插入图片描述

图2. 稀疏结构的构建

一个“好”的稀疏结构,应该是符合Hebbian原理的,我们应该把相关性高的一簇神经元节点连接在一起。 在图片数据中,邻近区域的数据相关性高,因此相邻的像素点被卷积操作连接在一起。我们可能有多个卷积核,在同一空间位置但在不同通道的卷积核的输出结果相关性极高通过 1 × 1 1\times1 1×1卷积能够把这些相关性很高的、在同一个空间位置但是不同通道的特征连接到一起。

网络结构

在这里插入图片描述

图3. GoogLeNet网络结构图

如图3所示,GoogLeNet(Inception v1)有22层深,除了最后一层的输出其中间节点的分类效果也很好。因此在InceptionNet中,还使用到了辅助分类节点(auxiliary classifiers),即将中间某一层的输出用作分类,并按一个较小的权重(0.3)加到最终分类结果中。这相当与做了模型融合,同时给网络增加了反向传播的梯度信号,也提供了额外的正则化,对于整个InceptionNet的训练很有裨益。

2. Inception家族

使用了异步的SGD训练,学习速率每迭代8个epoch降低4%。同时,Inception V1也使用了Multi-Scale、Multi-Crop等数据增强方法,并在不同的采样数据上训练了7个模型进行融合。

  1. 学了了VGGNet ,用两个 3 × 3 3\times3 3×3的卷积代替 5 × 5 5\times5 5×5的大卷积(用以降低参数量并降低过拟合),还提出了著名的Batch Normalization方法。
  2. BN是一个非常有效的正则化方法,可以让大型卷积网络的训练速度加快很多倍,同时收敛后的分类准确率也可以得到大幅提高。BN用于神经网络某层时,会对每一个mini-batch数据的内部进行标准化(normalization)处理,使输出规范化到 N ∼ ( 0 , 1 ) N\sim(0,1) N(0,1)的正态分布,减少了Internal Covariate Shift(内部神经元分布的改变)。
  3. BN的论文指出,传统的深度神经网络在训练时,每一层的输入的分布都在变化,导致训练变得困难,我们只能使用一个很小的学习速率解决这个问题。而对每一层使用BN之后,能够有效的解决这个问题,学习速率可以增大很多倍,达到之前的准确率所需要的迭代次数只有1/14,训练时间大大缩短。(BN在某种意义上还起到了正则化的作用,所以可以减少或者取消Dropout,简化网络结构。)
  4. 单纯的使用BN获得的增益并不明显,还需要一些相应的调整:
  • 增大学习速率并加快学习衰减速度以适用BN规范化后的数据;
  • 去除Dropout并减轻L2正则(BN已祈祷正则化的作用);
  • 去除LRN;
  • 更彻底地对训练样本进行shuffle;
  • 减少数据增强中对数据地光学畸变(BN训练更快,每个样本被训练的次数更少,因此更真实的样本对训练更有帮助);
    使用这些措施后,Inception V2的在训练达到Inception V1的准确率时快了14倍,并且在模型的训练时的准确率上限更高。

主要有两方面的改造:

  • 一是引入了Factorization into small convolutions 的思想, 将一个较大的二维卷积拆成两个较小的一维卷积,比如将 7 × 7 7\times7 7×7卷积拆成 1 × 7 1\times7 1×7卷积和 7 × 1 7\times1 7×1卷积,或者将 3 × 3 3\times3 3×3的卷积拆成 1 × 3 1\times3 1×3 3 × 1 3\times1 3×1卷积,如图4所示。
    在这里插入图片描述
图4. 将一个3×3卷积拆成1×3卷积和3×1卷积

一方面节约了大量参数,加速运算并减轻了过拟合(将 7 × 7 7\times7 7×7卷积拆成 1 × 7 1\times7 1×7卷积和 7 × 1 7\times1 7×1卷积,比拆成3个 3 × 3 3\times3 3×3卷积更节约参数),同时增加了一层非线性扩展模型表达能力。这种非对称的卷积结构拆分,其结果比对称地拆为几个相同的小卷积核效果更明显,可以处理更多、更丰富的空间特征,增加特征多样性。

  • 另一方面是优化了Inception Module的结构, 现在Inception Module有 35 × 35 , 17 × 17 , 8 × 8 35\times35,17\times17,8\times8 35×35,17×17,8×8三种不同的结构,如图5所示。
    在这里插入图片描述
图5. Inception V3中三种结构的Inception Module

这些Inception Module只在网络的后部出现,前部还是普通的卷积层。并且Inception V3除了在Inception Module中使用分支,还在分支中使用了分支(8×8的结构中),可以说是Network In Network In Network
Inception V3的网络结构如下表:

类型 kernel尺寸/步长(或注释) 输入尺寸
卷积 3×3 / 2 299×299×3
卷积 3×3 / 1 149×149×32
卷积 3×3 / 1 147×147×32
池化 3×3 / 2 147×147×64
卷积 3×3 / 1 73×73×64
卷积 3×3 / 2 71×71×80
卷积 3×3 / 1 35×35×192
Inception 模块组 3个Inception Module 35×35×288
Inception 模块组 5个Inception Module 17×17×768
Inception 模块组 3个Inception Module 8×8×1280
池化 8×8 8×8×2048
线性 logits 1×1×2048
Softmax 分类输出 1×1×1000

与Inception V3相比V4主要是结合了微软的ResNet。

3. TensorFlow实现

实现的是Inception V3,网络结构如上表。 Inception V3相对比较复杂,所以使用tf.contrib.slim辅助设计网络。contrib.slim中的一些功能和组建可以大大减少设计Inception Net的代码量,只需要少量的代码即可构建好有42层深的Inception V3。
实现代码:

import tensorflow as tf
from datetime import datetime
import time
import math

slim = tf.contrib.slim
#trunc_normal:产生截断的正态分布
trunc_normal = lambda stddev: tf.truncated_normal_initializer(0.0, stddev)

num_batches = 100

'''
inception_arg_scope:用来生成网络中经常用到的函数的默认参数,比如卷积的激活函数、权重初始化方式、标准化器等。
L2正则的weight_decay默认值为0.00004,标准差stddev默认值为0.1,参数batch_norm_var_collection默认值为moving_vars
'''
def inception_v3_arg_scope(weight_decay=0.00004,
                           stddev=0.1,
                           batch_norm_var_collection='moving_vars'):

    '''
    参数字典
    '''
    batch_norm_params = {
   
        'decay': 0.9997,    #衰减系数
        'epsilon': 0.001,
        'updates_collections': tf.GraphKeys.UPDATE_OPS,
        
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值