成都保障房中心官方网站,wordpress m1,disqus wordpress,网站接入服务单位名称目录 一、网络介绍
1、全连接层存在的问题
2、NiN的解决方案(NiN块)
3、NiN架构
4、总结
二、代码实现
1、定义NiN卷积块
2、NiN模型
3、训练模型 一、网络介绍 NiN#xff08;Network in Network#xff09;是一种用于图像识别任务的卷积神经网络模型。它由谷歌研究…目录 一、网络介绍
1、全连接层存在的问题
2、NiN的解决方案(NiN块)
3、NiN架构
4、总结
二、代码实现
1、定义NiN卷积块
2、NiN模型
3、训练模型 一、网络介绍 NiNNetwork in Network是一种用于图像识别任务的卷积神经网络模型。它由谷歌研究员Min Lin、Qiang Chen和Shouyuan Chen于2013年提出。NiN的设计理念是通过引入“网络中的网络”结构来增强模型的表示能力。
1、全连接层存在的问题 在之前的网络比如AlexNet和VGGNet后面都用了几个比较大的全连接层全连接层中的参数相比于卷积层多得多一个网络的参数大多都在全连接层并且可以认为主要分布在卷积层之后的第一个全连接层。因此全连接层最大的问题是可能造成过拟合。 2、NiN的解决方案(NiN块) NiN的核心思想是使用1x1卷积层替代传统的全连接层。传统的卷积神经网络通常使用卷积层提取特征然后通过全连接层进行分类。而NiN则在卷积层中引入了一种称为“1x1卷积”的操作这个操作可以看作是在每个像素点上进行的全连接操作。通过使用1x1卷积NiN能够在卷积层中引入非线性增加模型的表达能力并且减少了参数的数量。 和VGG一样NiN也有自己的块NiN块每一个NiN块其实就相当于一个小的神经网络因为它具有卷积层和类似于全连接层的 卷积层因此叫网络中的网络。NiN块首先有一个卷积层然后后跟两个 的卷积层 的卷积层等价于全连接层。 3、NiN架构 全局池化层池化层的高和宽等于输入的高和宽一个通道得出一个值用这个值当作对类别的预测。
4、总结 二、代码实现 NiN的想法是将空间维度中的每个像素视为单个样本将通道维度视为不同特征feature。下图说明了VGG和NiN及它们的块之间主要架构差异。NiN块以一个普通卷积层开始后面是两个 的卷积层。NiN块第一层的卷积窗口形状通常由用户设置。随后的卷积窗口形状固定为 。 1、定义NiN卷积块
import torch
from torch import nn
from d2l import torch as d2ldef 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_size1), nn.ReLU(),nn.Conv2d(out_channels, out_channels, kernel_size1), nn.ReLU())
2、NiN模型 最初的NiN网络是在AlexNet后不久提出的显然从中得到了一些启示。NiN使用窗口形状为、 和 的卷积层输出通道数量与AlexNet中的相同。每个NiN块后有一个最大池化层池化窗口形状为 步幅为2。 NiN和AlexNet之间的一个显著区别是NiN完全取消了全连接层。相反NiN使用一个个NiN块最后一个NiN块的输出通道数等于标签类别的数量。最后放一个全局平均池化层global average pooling layer生成一个对数几率logits。NiN设计的一个优点是它显著减少了模型所需参数的数量。然而在实践中这种设计有时会增加训练模型的时间。
net nn.Sequential(nin_block(1, 96, kernel_size11, strides4, padding0),nn.MaxPool2d(3, stride2),nin_block(96, 256, kernel_size5, strides1, padding2),nn.MaxPool2d(3, stride2),nin_block(256, 384, kernel_size3, strides1, padding1),nn.MaxPool2d(3, stride2),nn.Dropout(0.5),# 标签类别数是10nin_block(384, 10, kernel_size3, strides1, padding1), # 通道数先增加后减少1-96-256-384-10nn.AdaptiveAvgPool2d((1, 1)), # 注意这里的(1, 1)不是kernel_size而是output_size# 将四维的输出转成二维的输出其形状为(批量大小, 10)nn.Flatten()) # Flatten会把channel、height和width展平成一行 我们创建一个数据样本来查看每个块的输出形状。
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])
3、训练模型 我们使用Fashion-MNIST来训练模型。训练NiN与训练AlexNet、VGG时相似。
lr, num_epochs, batch_size 0.1, 10, 128
train_iter, test_iter d2l.load_data_fashion_mnist(batch_size, resize224) # 调节图片尺寸为224
d2l.train_ch6(net, train_iter, test_iter, num_epochs, lr, d2l.try_gpu())
loss 0.563, train acc 0.786, test acc 0.790
3087.6 examples/sec on cuda:0