网络中的网络(NiN)

老师这节课上说了 显存里包含的内容有:参数的权重,参数的梯度,以及梯度反向传播过程中的中间值,最后还有数据(batch_size)。
所以你这样干算基本是没法算出来的。
我只能说,去掉一个1x1卷积层,在相同条件下训练,我的GPU显存少了0.8G。所以那一个卷积层就占了800MB。

可能时因为只通过一次卷积就将384个通道缩减为10个通道,感受野会比较有限,输出结果的每个位置都只能捕获到输入特征图对应位置3*3领域的信息,通过多级缩减,能够更好地扩大感受野,提高特征提取和表征的能力

1 Like

图7.3.1 NiN的网络图,第二个NiN 块应该是padding=2(same),代码里是对的,图里写的是1。

1*1的不是只有1个参数,和输入输出通道数相关。

单层1*1卷积层的nin块

def nin_block(in_channels, out_channels, kernel_size, strides, padding):
    return nn.Sequential(
        nn.Conv2d(in_channels, out_channels, kernel_size, strides, padding),
        nn.ReLU(),
        nn.Conv2d(out_channels, out_channels, kernel_size=1), nn.ReLU())

结果:

loss 0.317, train acc 0.884, test acc 0.885
1759.6 examples/sec on cuda:0

两层1*1卷积层的nin块

def nin_block(in_channels, out_channels, kernel_size, strides, padding):
    return nn.Sequential(
        nn.Conv2d(in_channels, out_channels, kernel_size, strides, padding),
        nn.ReLU(),
        nn.Conv2d(out_channels, out_channels, kernel_size=1), nn.ReLU()),
        nn.Conv2d(out_channels, out_channels, kernel_size=1), nn.ReLU())

结果:

loss 0.317, train acc 0.883, test acc 0.884
1287.0 examples/sec on cuda:0

发现双层1*1卷积层没有显著提升性能,训练速度还是单层的70%左右。为什么要两层1*1卷积层呢?

论文原文 中提到的

Both layers map the local receptive field to a confidence value of the latent
concept.

这种网络的抽象能力似乎在这个图像识别问题上没有表现出很明显的效果