网络中的网络(NiN )(10月14号(group)d2l)深度卷积神经网络(NiN)
LeNet、AlexNet和VGG有共同的设计模式。 通过一系列卷积层和收敛层提取空间结构特征。 然后,在全连接层处理特征的特征。
AlexNet和VGG对LeNet的改进主要在于如何扩大和深化这两个模块。
可替代地,可以考虑在该过程的初期使用所有连接层。
但是,使用稠密层可能会完全放弃特征空间结构。
网络中的网络(NiN )提供了非常简单的解决方案。 每个像素通道分别使用多层探测器: cite : Lin.Chen.Yan.2013
NiN块回想卷积层的输入和输出由四维无邪笑容组成,无邪笑容的各个轴分别对应样品、通道、高度、宽度。
另外,全连结层的输入输出通常是分别对应样本和特征的2维天真的笑容。
NiN的想法是按高度和宽度对每个像素位置应用全连接层。
在每个空间位置连接权重时,可以将其视为11(times11卷积层或在每个像素位置独立工作的完全连接层,如:numref:sec_channels中所述。
从另一个角度看,空间维度的每个像素被看作单个样本,而信道维度被看作不同的特征。
:numref:fig_NiN显示了VGG和nin及其块之间的主要结构差异。
NiN块从常规卷积层开始,后面是两个11(times11 )的卷积层。 这两个111(times11卷积层作为具有ReLU激活函数的像素单位的所有连接层。
第一层卷积窗口的形状通常由用户设置。
后续的卷积窗的形状固定为111(times1)11。
importtorchfromtorchimportnnfromd2limporttorchasd2ldefnin _ block (in _ channels,out_channels,kernel_size, Striding padding ) : return nn.sequential (nn.conv 2d (in _ channels,out_channels,kernel_size,strides,pades nn.ReLU () ) importtorchfromtorchimportnnfromd2limporttorchasd2ldefnin _ block (in _ channels,out_channels, Kernel padding ) : return nn.sequential (nn.conv 2d (in _ channels,out_channels,kernel_size,strides,paddddes
NiN使用窗的形状为11 11
11times 11 11×11、 5 × 5 5times 5 5×5 和 3 × 3 3times 3 3×3的卷积层,输出通道数量与 AlexNet 中的相同。每个 NiN 块后有一个最大汇聚层,池化窗口形状为 3 × 3 3times 3 3×3,步幅为 2。
NiN 和 AlexNet 之间的一个显著区别是 NiN 完全取消了全连接层。
相反,NiN 使用一个 NiN块,其输出通道数等于标签类别的数量。最后放一个 全局平均汇聚层(global average pooling layer),生成一个多元逻辑向量(logits)。NiN 设计的一个优点是,它显著减少了模型所需参数的数量。然而,在实践中,这种设计有时会增加训练模型的时间。
我们创建一个数据样本来[查看每个块的输出形状]。
X = torch.rand(size=(1, 1, 224, 224))for layer in net: X = layer(X) print(layer.__class__.__name__,'output shape:t', X.shape) Sequential output shape: torch.Size([1, 96, 54, 54])MaxPool2d output shape: torch.Size([1, 96, 26, 26])Sequential output shape: torch.Size([1, 256, 26, 26])MaxPool2d output shape: torch.Size([1, 256, 12, 12])Sequential output shape: torch.Size([1, 384, 12, 12])MaxPool2d output shape: torch.Size([1, 384, 5, 5])Dropout output shape: torch.Size([1, 384, 5, 5])Sequential output shape: torch.Size([1, 10, 5, 5])AdaptiveAvgPool2d output shape: torch.Size([1, 10, 1, 1])Flatten output shape: torch.Size([1, 10]) [训练模型]和以前一样,我们使用 Fashion-MNIST 来训练模型。训练 NiN 与训练 AlexNet、VGG时相似。
lr, num_epochs, batch_size = 0.1, 10, 128train_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 1.213, train acc 0.603, test acc 0.609750.7 examples/sec on cuda:0左图为去掉一个 1 × 1 1times 1 1×1卷积之后的模型学习曲线、右图为原始模型设置的学习曲线;
# Find total parameters and trainable parameters# 统计模型参数总量和可训练参数总量-----取消了其中的一个1x1卷积层total_params = sum(p.numel() for p in net.parameters())print(f'{total_params:,} total parameters.')total_trainable_params = sum(p.numel() for p in net.parameters() if p.requires_grad)print(f'{total_trainable_params:,} training parameters.') 1,769,112 total parameters.1,769,112 training parameters. # Find total parameters and trainable parameters# 统计模型参数总量和可训练参数总量------保留原始模型设计total_params = sum(p.numel() for p in net.parameters())print(f'{total_params:,} total parameters.')total_trainable_params = sum(p.numel() for p in net.parameters() if p.requires_grad)print(f'{total_trainable_params:,} training parameters.') 1,992,166 total parameters.1,992,166 training parameters. 小结 NiN使用由一个卷积层和多个 1 × 1 1times 1 1×1 卷积层组成的块。该块可以在卷积神经网络中使用,以允许更多的每像素非线性。NiN去除了容易造成过拟合的全连接层,将它们替换为全局平均汇聚层(即在所有位置上进行求和)。该汇聚层通道数量为所需的输出数量(例如,Fashion-MNIST的输出为10)。移除全连接层可减少过拟合,同时显著减少NiN的参数。NiN的设计影响了许多后续卷积神经网络的设计。 练习 调整NiN的超参数,以提高分类准确性。为什么NiN块中有两个 1 × 1 1times 1 1×1 卷积层?删除其中一个,然后观察和分析实验现象。计算NiN的资源使用情况。 参数的数量是多少?计算量是多少?训练期间需要多少显存?预测期间需要多少显存? 一次性直接将 384 × 5 × 5 384 times 5 times 5 384×5×5 的表示缩减为 10 × 5 × 5 10 times 5 times 5 10×5×5 的表示,会存在哪些问题?Discussions