InceptionV2

综述

InceptionV2的核心思想来自Google的《Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift》[1]和《Rethinking the Inception Architecture for Computer Vision》[2]这两篇论文。它根据第一篇论文加入了BN层。根据第二篇论文用一系列更小的卷积核(3x3)替代了原来的大卷积核(5x5,7x7)[3]。

Batch Normalization

第一篇论文中提出了Internal Covariate Shift这个问题,文章中说,在训练神经网络的过程中,因为前一层的参数变化而导致每层的输入分布都在不断变化(the distribution of each layer’s inputs changes during training, as the parameters of the previous layers change.)。这使得我们需要更低的学习率和更小心地进行参数初始化,导致我们难以充分构建一个具有饱满地非线性结构的模型,而这个现象就被称作Internal Covariate Shift。

为了解决这个问题,Google提出了Batch Normalization(批规范化)[4]。即在每次SGD时,通过mini-batch来对相应的activation做归一化操作,使得结果(输出信号各个维度)的均值为0,方差为1,其具体做法如图1第三步(normalize).在Normalization完成后,Google的研究员仍对数值稳定性不放心,又加入了两个参数gammabeta,进行了scale and shift,如图1第四步。注意到,如果我们令gamma等于之前求得的标准差,beta等于之前求得的均值,则这个变换就又将数据还原回去了。两个参数与每层的W和b一样,是需要迭代求解的[5]。

图1

而这两个参数gammabeta的迭代求解过程,在论文中也给了出来,也是在反向传播的过程中算损失函数对gamma和beta两个参数的导数,还要求损失函数对Wx+b中的x的导数,以便使误差继续向后传播。其具体过程如图2所示,使用了链式法则。
图2

最后,文章给出了训练一个BN网络的方法,如图3.在训练的最后一个epoch时,要对这一epoch所有的训练样本的均值和标准差进行统计,这样在一张测试图片进来时,使用训练样本中的标准差的期望和均值的期望对测试数据进行归一化,注意这里标准差使用的期望是其无偏估计,如图3第10步所示。
图3

实际上,在tensorflow的源码里,inceptionV1也已经使用了Batch Normalization,只是给了一个参数用来选择是否使用,而从inceptionV2开始去掉了这个参数,都使用BN算法了。

更小的卷积核

大尺寸的卷积核可以带来更大的感受野,但也意味着更多的参数,比如5x5卷积核参数是3x3卷积核的25/9=2.78倍。为此,作者提出可以用2个连续的3x3卷积层(stride=1)组成的小网络来代替单个的5x5卷积层,(保持感受野范围的同时又减少了参数量)[6],并且可以避免表达瓶颈,加深非线性表达能力,如图4.

图4.用两个3x3卷积核替代5x5卷积核

同时,作者提出了两个问题并给出了回答:

  1. 这种替代会造成表达能力的下降吗? 后面有大量实验可以表明不会造成表达缺失;
  2. 3x3卷积之后还要再加激活吗? 作者也做了对比试验,表明添加非线性激活会提高性能。
    这样,新的inception结构如图5所示。
图5.InceptionV2

其代码实现如下所示:

with tf.variable_scope(end_point):
        with tf.variable_scope('Branch_0'):
          branch_0 = slim.conv2d(net, depth(64), [1, 1], scope='Conv2d_0a_1x1')
        with tf.variable_scope('Branch_1'):
          branch_1 = slim.conv2d(
              net, depth(64), [1, 1],
              weights_initializer=trunc_normal(0.09),
              scope='Conv2d_0a_1x1')
          branch_1 = slim.conv2d(branch_1, depth(64), [3, 3],
                                 scope='Conv2d_0b_3x3')
        with tf.variable_scope('Branch_2'):
          branch_2 = slim.conv2d(
              net, depth(64), [1, 1],
              weights_initializer=trunc_normal(0.09),
              scope='Conv2d_0a_1x1')
          branch_2 = slim.conv2d(branch_2, depth(96), [3, 3],
                                 scope='Conv2d_0b_3x3')
          branch_2 = slim.conv2d(branch_2, depth(96), [3, 3],
                                 scope='Conv2d_0c_3x3')
        with tf.variable_scope('Branch_3'):
          branch_3 = slim.avg_pool2d(net, [3, 3], scope='AvgPool_0a_3x3')
          branch_3 = slim.conv2d(
              branch_3, depth(32), [1, 1],
              weights_initializer=trunc_normal(0.1),
              scope='Conv2d_0b_1x1')
        net = tf.concat(3, [branch_0, branch_1, branch_2, branch_3])
        end_points[end_point] = net

总结

在我看来,inceptionV2更像一个过渡,它是Google的工程师们为了最大程度挖掘inception这个idea而进行的改良,它使用的Batch Normalization是对inceptionV1的一个补充,而用小的卷积核去替代大的卷积核这一点,在inceptionV3中发扬光大,实际上,《Rethinking the Inception Architecture for Computer Vision》这篇论文正是tensorflow源码中所写的incptionV3的核心论文,而这篇论文中把提出的新的网络结构称作inceptionV2(而代码实现却叫inceptionV3)。这大概也是Google的工程师和科学家们的一个小失误吧,不过从这里也可以看出inceptionV2也是对新思想的一个尝试。

Reference

[1]Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift

[2]Rethinking the Inception Architecture for Computer Vision
[3]googleNet Inception v1 - v4 papers 发展历程(CSDN)
[4]深度学习中 Batch Normalization为什么效果好?(知乎)
[5]“Batch Normalization Accelerating Deep Network Training by Reducing Internal Covariate Shift”阅读笔记与实现
[6]Inception in CNN(CSDN)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 142,061评论 1 300
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 60,947评论 1 255
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 93,744评论 0 211
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 40,878评论 0 175
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 48,601评论 1 255
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 38,696评论 1 175
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 30,324评论 2 267
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 29,120评论 0 165
  • 想象着我的养父在大火中拼命挣扎,窒息,最后皮肤化为焦炭。我心中就已经是抑制不住地欢快,这就叫做以其人之道,还治其人...
    爱写小说的胖达阅读 28,921评论 6 229
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 32,459评论 0 213
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 29,234评论 2 214
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 30,558评论 1 226
  • 白月光回国,霸总把我这个替身辞退。还一脸阴沉的警告我。[不要出现在思思面前, 不然我有一百种方法让你生不如死。]我...
    爱写小说的胖达阅读 24,203评论 0 31
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 27,088评论 2 213
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 31,460评论 3 204
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 25,604评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 25,975评论 0 166
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 33,460评论 2 230
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 33,536评论 2 229

推荐阅读更多精彩内容