Inception-v2

声明:文章仅作知识整理、分享,如有侵权请联系作者删除博文,谢谢!

经典分类网络(传送门):目录索引LeNetAlexNetVGGResNetInceptionDenseNetSeNet

相关文章:Inception-v1Inception-v3、v4

1、特点-加入BN

加入BN后带来的收益:

1)神经网络的训练是复杂的,训练时,每一层的输入分布都会随着前一层参数变化而改变。这个现象称为内部协变量位移,并通过规范化层解决这个问题;

2)加入BN,实现同样精度,训练步骤减少了14倍

2、出发点

2.1、mini-batch SGD优缺点

论文首先指出了mini-batch SGD的好处:

1)batch越大,效果越好

2)m个样本并行计算,要比m个样本单独计算,效率要高很多

mini-batch SGD的缺点:

模型的超参数,非常难调优:需要对初始值和学习率非常细致的tune,难度比较大

进一步分析,得出造成调优困难的原因:

每层结构的数据输入,都会受到前面所有层的参数的影响,从而会导致数据的分布总是发生变化(称为’Internal Covariate shift’)。很小的参数变换,都会对后面的数据输入造成很大的扰动,层越深,这种扰动越大(类似于混沌)。

2.2、BN思想来源

如果数据的分布不发生改变,真的会是的网络的训练变得更简单吗?

首先,考虑机器学习领域中的一个很重要的假设:

IID独立同分布假设:如果训练数据与测试数据满足相同的分布,那么通过神经网络训练出来的模型,能够在测试集上同样取得很好的效果。

同样,在训练的过程中,如果每一层的数据输入保持稳定的数据分布,那么对于网络的训练肯定是有帮助的。

在机器学习中,常用的数据处理的方法“白化操作”(whiten),例如PCA降维等方法,可以有效的提升机器学习的效果。而“白化操作”本质上,就是对输入数据的分布进行改变,使其变为均值为0,单位方差的正态分布。

从而,作者认为如果对每一层的数据输入,固定其分布,可定能够加快深度模型的训练。

3、BN思想

在训练的过程中,由于模型的参数不断在变化,导致每一层结构的数据输入的分布都会发生变化(Internal Covariate Shift),作者提出了一种改善该问题的机制(Batch Normalization):归一化(固定每一层数据输入的均值和方差)

Batch Normalization带来了哪些好处?

1)加快训练速度;

2)对网络中信息的流动带来好处,使得网络参数的依赖相关性减弱;

3)可以使用更大的学习率;

4)BN相当于正则化,从而可以减弱Dropout的作用,或者去掉dropout操作;

5)BN使得使用哪些带有饱和性质的激活函数构建网络,如sigmoid,tanh等。

Batch Normalization为什么使得带有饱和性质的激活函数,可以应用到很深的网络结构中?

对于正太分布来说:

而如果将输入分布,归一化到均值为0,方差为1的正太分布上,那么95.44%的数据都会集中在[-2,2]范围内,而对于sigmoid函数:

在[-2,2]区间内,近似线性变换,梯度也较大,可以有效的缓解由于左右饱和带来的梯度消失的问题。

但同时,这种归一化,也来了一个问题:由于数据集中到sigmoid的近似线性部分,从而破坏了激活函数的非线性,导致模型的非线性表达能力不足。为了解决这个问题,作者在归一化后面加了尺度变换和平移变换,保证模型的非线性表达能力。

Batch Normalization变换:

4、感受野对指标的影响

大家共同的认知是如果模型的感受野的像素越高那么越会有更加好的识别效果。然而,非常重要的一点是我们要区分第一层感受野像素的增加带来的效果以及更大模型的容量和计算量带来的效果。如果仅仅只改变输入的像素而不调整模型的话,我们会使用一个计算量小的模型去处理一个困难的问题,当然,显然这样是不行的,因为计算效果下降了。为了能够较为准确的分析这个问题:当计算效果不变的时候,到底多高的输入像素会帮助更大呢?一个简单的方法来保证计算效果不变就是降低前两层的步长,或者 直接取消网络的第一个pooling层。于是我们做了如下实验:

1、299x299的感受野,在第一层(步长2)之后跟上最大池化;

2、151x151的感受野,在第一层(步长1)之后跟上最大池化;

3、79x79的感受野,在第一层(步长1)之后不跟最大池化。

那么这三个网络都有几乎相同的计算开销。应该第三个网络稍微开销小了一点,但是pooling层的计算量是很小的。对于每个网络都训练到收敛,并且使用ImageNet ILSVRC 2012分类参照的验证集来测试得到下表:

上一篇:Inception-v1,下一篇:Inception-v3、v4,传送门:分类网络目录索引

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
以下是Inception-V2的PyTorch代码实现: ```python import torch import torch.nn as nn class InceptionV2Block(nn.Module): def __init__(self, in_channels, out_1x1, reduce_3x3, out_3x3, reduce_5x5, out_5x5, out_pool): super(InceptionV2Block, self).__init__() # 1x1 Convolution branch self.branch1 = nn.Sequential( nn.Conv2d(in_channels, out_1x1, kernel_size=1), nn.BatchNorm2d(out_1x1), nn.ReLU(inplace=True) ) # 3x3 Convolution branch self.branch2 = nn.Sequential( nn.Conv2d(in_channels, reduce_3x3, kernel_size=1), nn.BatchNorm2d(reduce_3x3), nn.ReLU(inplace=True), nn.Conv2d(reduce_3x3, out_3x3, kernel_size=3, padding=1), nn.BatchNorm2d(out_3x3), nn.ReLU(inplace=True) ) # 5x5 Convolution branch self.branch3 = nn.Sequential( nn.Conv2d(in_channels, reduce_5x5, kernel_size=1), nn.BatchNorm2d(reduce_5x5), nn.ReLU(inplace=True), nn.Conv2d(reduce_5x5, out_5x5, kernel_size=5, padding=2), nn.BatchNorm2d(out_5x5), nn.ReLU(inplace=True) ) # Max Pooling branch self.branch4 = nn.Sequential( nn.MaxPool2d(kernel_size=3, stride=1, padding=1), nn.Conv2d(in_channels, out_pool, kernel_size=1), nn.BatchNorm2d(out_pool), nn.ReLU(inplace=True) ) def forward(self, x): branch1_output = self.branch1(x) branch2_output = self.branch2(x) branch3_output = self.branch3(x) branch4_output = self.branch4(x) return torch.cat([branch1_output, branch2_output, branch3_output, branch4_output], 1) class InceptionV2(nn.Module): def __init__(self, num_classes=1000): super(InceptionV2, self).__init__() self.conv1 = nn.Sequential( nn.Conv2d(3, 64, kernel_size=7, stride=2, padding=3), nn.BatchNorm2d(64), nn.ReLU(inplace=True), nn.MaxPool2d(kernel_size=3, stride=2, padding=1) ) self.conv2 = nn.Sequential( nn.Conv2d(64, 64, kernel_size=1), nn.BatchNorm2d(64), nn.ReLU(inplace=True), nn.Conv2d(64, 192, kernel_size=3, padding=1), nn.BatchNorm2d(192), nn.ReLU(inplace=True), nn.MaxPool2d(kernel_size=3, stride=2, padding=1) ) self.inception3a = InceptionV2Block(192, 64, 96, 128, 16, 32, 32) self.inception3b = InceptionV2Block(256, 128, 128, 192, 32, 96, 64) self.inception4a = InceptionV2Block(480, 192, 96, 208, 16, 48, 64) self.inception4b = InceptionV2Block(512, 160, 112, 224, 24, 64, 64) self.inception4c = InceptionV2Block(512, 128, 128, 256, 24, 64, 64) self.inception4d = InceptionV2Block(512, 112, 144, 288, 32, 64, 64) self.inception4e = InceptionV2Block(528, 256, 160, 320, 32, 128, 128) self.inception5a = InceptionV2Block(832, 256, 160, 320, 32, 128, 128) self.inception5b = InceptionV2Block(832, 384, 192, 384, 48, 128, 128) self.avg_pool = nn.AdaptiveAvgPool2d((1, 1)) self.dropout = nn.Dropout(0.4) self.fc = nn.Linear(1024, num_classes) def forward(self, x): x = self.conv1(x) x = self.conv2(x) x = self.inception3a(x) x = self.inception3b(x) x = self.inception4a(x) x = self.inception4b(x) x = self.inception4c(x) x = self.inception4d(x) x = self.inception4e(x) x = self.inception5a(x) x = self.inception5b(x) x = self.avg_pool(x) x = x.view(x.size(0), -1) x = self.dropout(x) x = self.fc(x) return x ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

jingbo1801

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值