在2014年的ImageNet图像识别挑战赛中,一个名叫GoogLeNet的网络结构大放异彩。它虽然在名字上向LeNet致敬,但在网络结构上已经很难看到LeNet的影子。GoogleNet吸收了NiN中网络串联网络的思想,并在此基础上做了很大改进。在随后的几年里,研究人员对GoogLeNet进行了数次改进,本节将介绍这个模型系列的第一个版本。
4.9.1 Inception块
GoogLeNet中的基础卷积块叫做Inception块,得名于同名电影《盗梦空间》(Inception)。与上一节介绍的NiN块相比,这个基础块在结构上更加复杂,如图4.8所示。
由图可以看出,Inception块里有4条并行的线路。前3条线路使用窗口大小分别是1x1、3x3和5x5的卷积层来抽取不同空间尺寸下的信息,其中中间2个线路会对输入先做1x1卷积来减少输入通道数,以降低模型复杂度。第四条线路则使用3x3最大池化层,后接1x1卷积层来改变通道数。4条线路都使用了合适的填充来使输入与输出的高和宽一致。最后我们将每条线路的输出在通道维上连结,并输入接下来的层中去。
Inception块中可以自定义的超参数是每个层的输出通道数,我们一次来控制模型复杂度。
4.9.2 GoogLeNet模型
GoogLeNet跟VGG一样,在主题卷积部分中使用5个模块(block),每个模块之间使用步幅为2的3x3最大池化层来减小输出高宽。第一模块使用一个64通道的7x7卷积层。
第二模块使用2个卷积层:首先是64通道的1x1卷积层,然后是将通道增大3倍的3x3卷积层。它对应Inception块中的第二条线路。
第三模块串联2个完整的Inception块。第一个Inception块的输出通道数为64+128+32+32 = 256,其中4条线路的输出通道数比例为64:128:32:32 = 2:4:1:1。其中第二、第三条线路先分别将输入通道数减小至96/192 = 1:2和16/192 = 1/12后,再接上第二层卷积层。第二个Inception块输出通道数增至128+192+96+64 = 480,每条线路的输出通道数之比为128:192:96:64 = 4:6:3:2。其中第二、第三条线路先分别将输入通道数减小至128/256 = 1/2和32/256 = 1/8。
第四模块更加复杂。它串联了5个Inception块,其输出通道数分别是192 + 208 + 48 + 64 = 512、160+224+64+64=512、128+256+64=512、112+288+64+64=528和256+320+128+128=832。这些线路的通道数分配和第三模块中的类似、首先含3x3卷积层的第二条线路输出最多通道,其次是仅含1x1卷积层的第一条线路,之后是含5x5卷积层的第三条线路和含3x3最大池化层的第四条线路。其中第二、第三条线路都会先按比例减小通道数。这些比例在各个Inception块中都略有不同。
第五模块有输出通道数为256+320+128+128 = 832和364+384+128+128 =1024的两个Inception块。其中每条线路的通道数的分配思路和第三、第四模块中的一致,只是在具体数值上有所不同。需要注意的是,第五模块的后面紧跟输出层,该模块同NiN一样使用全局平均池化层来将每个通道的高和宽变为1。最后我们将输出变成二维数组后接上一个输出个数为标签类别数的全连接层。
GoogLeNet模型的计算复杂,而且不如VGG那样便于修改通道数。本节里我们将输入的高和宽从224降到96来简化计算。下面演示各个模块之间的输出的形状变化。
4.9.3 获取数据和训练模型
我们使用高和宽均为96像素的图像来训练GoogLeNet模型。训练使用的图像依然来自Fashion-MNIST数据集。