Torch中nn.inception的参数设置

在torch的dpnn库中有inception模块的实现。其调用方式一般是这样的。

   nn.Inception{
     inputSize = 192,
     kernelSize = {3, 5},
     kernelStride = {1, 1},
     outputSize = {128, 32},
     reduceSize = {96, 16, 32, 64},
     pool = nn.SpatialMaxPooling(3, 3, 2, 2),
     batchNorm = true
   }

其中kernelSize,outputSize和reduceSize这三个参数值得注意。
在google的论文中,inception模块包括4个并行的子网络。
1. 1x1卷积 -> relu -> 3x3卷积 -> relu
2. 1x1卷积 -> relu -> 5x5卷积 -> relu
3. 3x3MaxPooling ->1x1卷积 -> relu
4. 1x1卷积 -> relu
在这个inception的实现中,把这4个子网络分成两类。一个1x1卷积接一个NxN卷积的属于前一类,用户可以随意指定NxN卷积核的大小(kernelSize)和数量(outputSize)。也可以随意增加这种子网络的数量; 3x3池化接1x1卷积还有单独一个1x1卷积的属于第二类。用户不能改变子网络的数量和类型。
其中所有的1x1卷积的目的都是缩减卷积map的层数(reduce)。用户可以通过reduceSize来指定缩减的目标。
由于第一类子网络是reduce之后再卷积,所以它们的输出channel数量应该是NxN卷积核的数量,而第二类是最后reduce,它们的输出channel数就是reduceSize中的数量。
以上面的代码为例,最后4个子网络摞在一起的channel数量应该是前两个子网络的outputSize加上后两个子网络的reduceSize。128+32+32+64 = 256。
如果这个inception模块下面还有别的模块,那它的inputSize就应该是256了。

reduceSize的后两个还可以写成nil,如下:

   nn.Inception{
     inputSize = 320,
     kernelSize = {3, 5},
     kernelStride = {2, 2},
     outputSize = {256, 64},
     reduceSize = {128, 32, nil, nil},
     pool = nn.SpatialMaxPooling(3, 3, 2, 2),
     batchNorm = true
   })

reduceSize为nil的意思就是不加1x1的卷积层。这样的话第三个子网络就只有一个3x3的MaxPooling,它输出的channel和输入一样,是320。而第四个子网络压根就不存在了。所以这个inception模块的输出channel等于256+64+320+0=640。

你可能感兴趣的:(Torch中nn.inception的参数设置)