深度学习笔记(30) Inception网络
1. Inception模块
构建卷积层时
要决定过滤器的大小究竟是1×1,3×3还是5×5,或者要不要添加池化层
而Inception网络的作用就是自主决定
虽然网络架构因此变得更加复杂,但网络表现却非常好
例如,28×28×192维度的输入层
Inception网络或Inception层的作用:
代替人工来确定卷积层中的过滤器类型,或者确定是否需要创建卷积层或池化层
如果使用1×1卷积,输出结果会是28×28×filters
假设输出为28×28×64,并且这里只有一个层
如果使用3×3的过滤器,,应用same卷积,输出是28×28×128
然后把第二个值堆积到第一个值上
或许用5×5过滤器或许会更好,输出变成28×28×32
再次使用same卷积,保持维度不变
或许只用池化操作,得到一些不同的输出结果
把它也堆积起来,这里的池化输出是28×28×32
为了匹配所有维度,需要对最大池化使用padding,它是一种特殊的池化形式
因为如果输入的高度和宽度为28×28,则输出的相应维度也是28×28
然后再进行池化,padding不变,步幅为1
有了Inception模块,就可以输入某个量,因为它累加了所有数字
这里的最终输出32+32+128+64=256
基本思想是Inception网络不需要人为决定使用哪个过滤器或者是否需要池化
而是由网络自行确定这些参数,可以给网络添加这些参数的所有可能值,然后把这些输出连接起来
让网络自己学习它需要什么样的参数,采用哪些过滤器组合
2. 瓶颈层
但不难发现,所描述的Inception层有一个问题,就是计算成本
在之前5×5的过滤器,一个28×28×192的输入块,执行一个5×5卷积,它有32个过滤器,输出为28×28×32
计算这个28×28×32输出的计算成本:
它有32个过滤器,因为输出有32个通道,每个过滤器大小为5×5×192,输出大小为28×28×32
所以要计算28×28×32个数字
对于输出中的每个数字来说,都需要执行 5×5×192 次乘法运算
所以乘法运算的总次数为每个输出值所需要执行的乘法运算次数(5×5×192)乘以输出值个数(28×28×32)
把这些数相乘结果等于1.2亿(120422400)
即使在现在,用计算机执行1.2亿次乘法运算,成本也是相当高的
这是另外一种架构,其输入为28×28×192,输出为28×28×32
其结果是这样的,对于输入层,使用1×1卷积把输入值从192个通道减少到16个通道
然后对这个较小层运行5×5卷积,得到最终输出
请注意,输入和输出的维度依然相同,输入是28×28×192,输出是28×28×32
但要做的就是把左边这个大的输入层压缩成这个较小的的中间层,它只有16个通道,而不是192个
这被称为 瓶颈层
瓶颈通常是某个对象最小的部分,瓶颈就是这个瓶子最小的部分
同理,瓶颈层也是网络中最小的部分,先缩小网络表示,然后再扩大它
这个第一个卷积层的计算成本:
应用1×1卷积,过滤器个数为16,每个过滤器大小为1×1×192
这两个维度相匹配(输入通道数与过滤器通道数)
28×28×16这个瓶颈层的计算成本:
输出28×28×16中每个元素都做192次乘法,用1×1×192来表示
相乘结果约等于240万
第二个卷积层的计算28×28×32,对每个输出值应用一个5×5×16维度的过滤器
计算结果为1000万
所以所需要乘法运算的总次数是这两层的计算成本之和1204万
计算成本从1.2亿下降到了原来的十分之一
总结一下,如果在构建神经网络层的时候,不想决定池化层是使用1×1,3×3还是5×5的过滤器
那么Inception模块就是最好的选择,可以应用各种类型的过滤器,只需要把输出连接起来
之后关于计算成本问题,可以通过使用1×1卷积来构建瓶颈层,从而大大降低计算成本
3. Inception网络
Inception模块会将之前层的激活或者输出作为它的输入,作为前提
这是一个28×28×192的输入
先通过一个1×1的层,再通过一个5×5的层
1×1的层可能有16个通道,而5×5的层输出为28×28×32
为了在这个3×3的卷积层中节省运算量,也可以做相同的操作
这样的话3×3的层将会输出28×28×128
或许还想将其直接通过一个1×1的卷积层
这样的话过程就只有一步,假设这个层的输出是28×28×64
接着是池化层
为了能在最后将这些输出都连接起来,会使用same类型的padding来池化
使得输出的高和宽依然是28×28,这样才能将它与其他输出连接起来
但注意,如果进行了最大池化,即便用了same padding,3×3的过滤器,stride为1
其输出将会是28×28×192,其通道数或者说深度与这里的输入(通道数)相同
所以看起来它会有很多通道
实际要做的就是再加上一个1×1的卷积层,将通道的数量缩小,缩小到28×28×32
也就是使用32个维度为1×1×192的过滤器,所以输出的维度其通道数缩小为32
这样就避免了最后输出时,池化层占据所有的通道
最后,将这些方块全都连接起来,把得到的各个层的通道都加起来
最后得到一个28×28×256的输出
这就是一个Inception模块
而Inception网络所做的就是将这些模块都组合到一起
4. Inception网络的细节
这是一张取自Szegety et al的论文中关于Inception网络的图片
会发现图中有许多重复的模块,可能整张图看上去很复杂
但如果只截取其中一个环节,就会发现上述的Inception模块
所以Inception网络只是很多这些学过的模块在不同的位置重复组成的网络
所以如果理解了之前所学的Inception模块,就也能理解Inception网络
在网络的最后几层,通常称为全连接层
在它之后是一个softmax层(编号1)来做出预测
这些分支(编号2)所做的就是通过隐藏层(编号3)来做出预测
所以这其实是一个softmax输出(编号2),(编号1)也是
另一条分支(编号4),它也包含了一个隐藏层
通过一些全连接层,然后一个softmax来预测,输出结果的标签
应该把它看做Inception网络的一个细节
它确保了即便是隐藏单元和中间层(编号5)也参与了特征计算
它在Inception网络中,起到一种调整的效果,并且能防止网络发生过拟合
Inception网络,无非是很多个Inception模块一环接一环,最后组成了网络
参考:
相关推荐:
深度学习笔记(29) 1×1 卷积
深度学习笔记(28) 残差网络
深度学习笔记(27) 经典卷积网络
深度学习笔记(26) 卷积神经网络
深度学习笔记(25) 池化层
谢谢!