网络中的网络(NiN)

image
这是我 lr=0.03 batch_size=128 epochs=25的结果,同样出现了Loss和Acc的波动。有人能解释一下为什么吗?>.<

训练集loss逐渐下降,然后loss反而增大。这不是过拟合,因为过拟合时,train_loss仍然是下降的。这种情况是网络退化。残差网络ResNet 可以解决这一问题。

是不是学习率爆炸啊,当学习率设置过大时,每次参数更新的步长也会变得很大,可能会导致在损失函数的表面上来回震荡,无法收敛到最小点。甚至在极端情况下,参数更新的步长可能足够大,使得损失函数的值越来越大,使得模型发散。

在Q2中,我减小了NiN块的一个卷积层,然后调参,准确率达到90%以上。

net = nn.Sequential(
    nin_block(1, 96, kernel_size=11, strides=4, padding=0),
    nn.MaxPool2d(3, stride=2),
    nin_block(96, 256, kernel_size=5, strides=1, padding=2),
    nn.MaxPool2d(3, stride=2),
    nin_block(256, 256, kernel_size=3, strides=1, padding=1),
    nn.MaxPool2d(3, stride=2),
    nn.Dropout(0.5),
    # 标签类别数是10
    nin_block(256, 10, kernel_size=3, strides=1, padding=1),
    nn.AdaptiveAvgPool2d((1, 1)),
    # 将四维的输出转成二维的输出,其形状为(批量大小,10)
    nn.Flatten())

lr, num_epochs, batch_size = 0.04, 30, 128
train_iter, test_iter = d2l.load_data_fashion_mnist(batch_size, resize=224)
d2l.train_ch6(net, train_iter, test_iter, num_epochs, lr, d2l.try_gpu())

结果是:
loss 0.239, train acc 0.911, test acc 0.909
3530.1 examples/sec on cuda:0

image

在我的电子书里,AlexNet输出通道确实是96, 256, 384, 10。你说的64, 128, 256, 512,是VGG的通道数设置吧。

我有个疑问是您的前一个回答“原始的NiN模型对于这个数据集过于复杂了”,模型复杂的意思本身似乎就是参数量很大?这样的话,那过于复杂是不是就是说过拟合了。。
我个人对2个1x1没有1个1x1效果好的看法是:
首先不是过拟合,因为(1)像您说的train&test acc没有显著差异,说明没有出现过拟合;(2)1x1的卷积核的参数量是in_chxout_ch,对256来说也就是60k的数量级,相比网络本身不算很大,所以加上1层应该不会让模型变得过于复杂?
我觉得几层1x1就是一个工程的问题:神经网络是一门语言,用来描述数据集蕴含的特征信息(引自沐神),对ImageNet来说2层1x1更好地提取描述像素的非线性,对Fashion-MNIST来说1层更好。我们只知道“1x1层数和数据集有关”,具体几层,试一试就完了 :joy: