首页 > 编程知识 正文

pytorch自定义卷积,pytorch 拉普拉斯算子

时间:2023-05-04 10:29:09 阅读:174824 作者:1987

网络中的网络(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 设计的一个优点是,它显著减少了模型所需参数的数量。然而,在实践中,这种设计有时会增加训练模型的时间。

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, 384, kernel_size=3, strides=1, padding=1), nn.MaxPool2d(3, stride=2), nn.Dropout(0.5), # 标签类别数是10 nin_block(384, 10, kernel_size=3, strides=1, padding=1), nn.AdaptiveAvgPool2d((1, 1)), # 将四维的输出转成二维的输出,其形状为(批量大小, 10) nn.Flatten()) 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, 384, kernel_size=3, strides=1, padding=1), nn.MaxPool2d(3, stride=2), nn.Dropout(0.5), # 标签类别数为10 nin_block(384, 10, kernel_size=3, strides=1, padding=1), nn.AdaptiveAvgPool2d((1, 1)), # 将四维的输出转化为二维的输出, 其形状为(批量大小, 10) nn.Flatten() )

我们创建一个数据样本来[查看每个块的输出形状]。

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

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。