理解深度学习中的Inception网络
背景
构建CNN时,你要决定卷积核的大小,是1x3合适,还是3x3合适,还是5x5合适?要不要添加pooling层?
做这些决定(很可能是通过grid search)很麻烦,对吧?
Inception网络的优点,就是能代替你做决定,酷吧!
Inception层的基本思想
Inception层
是Inception网络
中的基本结构。Inception层
的基本原理如下图:
Inception层
中,有多个卷积层结构(Conv)和Pooling结构(MaxPooling),它们利用了padding的原理,让经过这些结构的最终结果Shape不变。
- C_1X1: 28x28x192的输入数据,与64个1x1的卷积核做卷积后,得到28x28x64的输出
- C_3X3: 28x28x192的输入数据,与128个3x3的卷积核做卷积后,得到28x28x128的输出
- C_5X5: 28x28x192的输入数据,与32个5x5的卷积核做卷积后,得到28x28x32的输出
- MP: 28x28x192的输入数据,做MaxPooling后(带padding),得到28x28x32的输出
多个Inception层
组合在一起,就构成了Inception网络
。但这样直接计算,计算量很大,所以要利用1x1的卷积核,来降低计算量。
1x1的卷积如何降低计算量
考虑如下问题,经过这一次卷积后,计算量为多少?
- 输入数据维度:28x28x192
- 卷积核大小:5x5x32
- 输出数据维度:28x28x32
输出数据共有28x28x32个值,每个值都要进行5x5x192次乘法(卷积中的)运算,所以一共要进行28x28x32x5x5x192次乘法计算,即120,422,400。
同样的问题,如果先经过1x1的卷积计算,再通过,如下图
- 输入数据维度:28x28x192
- 卷积核1大小:1x1x16
- 卷积核2大小:5x5x32
- 输出数据维度:28x28x32
经过第一个卷积层,要进行(28x28x16x1x1x192=2,408,448)次乘法计算,经过第二个卷积层,要进行(28x28x32x5x5x16=10,035,20)次乘法计算。总共计算次数也就是(2,408,448+10,035,20=12,443,648)次,比上面直接经过一个卷基层的计算量(120,422,400)要小很多。
可见,用好1x1的卷积核,就能降低计算量。
Inception网络
带有1x1卷积核的Inception层
,就构成了Inception网络
的基本单元,如下图:
这样的多个Inception层
组合在一起,就构成了Inception网络
,如下图:
当然,实际论文中的Inception网络
还包括输出端的全连接层,还有Inception网络
会从中间层引出多个输出,再连接SoftMax
,这样能减少过拟合(让中间层也起作用)。
总结
Inception
是电影盗梦空间
的名字,Google发明的Inception网络
取名也是来自这个电影。
Inception网络
是由多个Inception层
组成的,它的最大优点是可以一定程度上帮你省去指定CNN卷积核大小和MP调优的工作。