卷积神经网络CNN-part5-NiN

卷积神经网络CNN-part4-VGG-CSDN博客

摘要:本文介绍了网络中的网络(NiN)结构,对比了AlexNet、VGG等经典CNN架构。NiN采用多层1x1卷积替代全连接层,通过NiN块(普通卷积+两个1x1卷积)构建网络,显著减少参数量。文中详细给出了NiN块和网络的PyTorch实现代码,展示了各层输出维度变化,并进行了Fashion-MNIST数据集训练。最后对比分析了不同CNN网络的内部结构特点,指出NiN在减少参数方面的优势,但也可能增加训练时间。

0. 前言

深度学习网络我们前面讲了AlexNet和VGG,AlexNet将神经网络的层数进行了扩张,使用多个卷积层和多个全连接层提取数据特征。VGG提出了块的结构给研究人员提供了一种设计网络的新结构,即通过不同块的组合来构建深度神经网络。Network in Network提供了另外一种思路,即抛开了可能丢失对象特征的全连接层,只通过卷积层和聚集层来构建网络。如下图所示。

仔细看图中内容,我们发现NiN单个块就相当于卷积MLP(多层感知机),即多层感知机作为单独模块传递,总网络是由多个卷积MLP构成的网络,所以称之为网络中的网络。

1. NiN(Network In Network)

1.1NiN块

我们这里构建的NiN块是以一个普通卷积层开始,再增加两个1x1的卷积层。这两个卷积层充当带有ReLU激活函数的逐像素全连接层。

python 复制代码
def nin_block(in_channel, out_channel, kernel_size, stride, padding):
    return nn.Sequential(
        nn.Conv2d(in_channel, out_channel, kernel_size, stride, padding=padding),
        nn.ReLU(),
        nn.Conv2d(out_channel, out_channel, kernel_size=1),nn.ReLU(),
        nn.Conv2d(out_channel, out_channel, kernel_size=1),nn.ReLU()
    )

1.2NiN网络

NiN网络是在AlexNet后不久提出的。NiN使用窗口形状为11x11、5x5和3x3的卷积层,输出通道数与AlexNet相同。每个NiN块后有一个最大汇聚层,汇聚窗口形状为3x3,步幅为2。

NiN的特点是显著减少了模型所需参数的数量。当然,在实践中,这种设计有时会增加训练模型的时间。

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

我们来查看以下每个块的输出形状。

python 复制代码
X=torch.rand(size=(1,1,224,224))
for layer in net:
    X=layer(X)
    print(layer.__class__.__name__,'output shape:\t',X.shape)

输出:

第一个NiN块: Sequential output shape: torch.Size([1, 96, 54, 54])

第一个最大汇聚层: MaxPool2d output shape: torch.Size([1, 96, 26, 26])

第二个NiN块: Sequential output shape: torch.Size([1, 256, 26, 26])

第二个最大汇聚层: MaxPool2d output shape: torch.Size([1, 256, 12, 12])

第三个NiN块: Sequential output shape: torch.Size([1, 384, 12, 12])

第三个最大汇聚层: MaxPool2d output shape: torch.Size([1, 384, 5, 5])

丢弃层: Dropout2d output shape: torch.Size([1, 384, 5, 5])

第四个NiN块: 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])

2. 训练

python 复制代码
#数据集获取
lr,num_epochs,batch_size = 0.1,10,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())

3.各网络对比

3.1内部构成对比

相关推荐
deephub14 小时前
构建自己的AI编程助手:基于RAG的上下文感知实现方案
人工智能·机器学习·ai编程·rag·ai编程助手
AI营销干货站14 小时前
工业B2B获客难?原圈科技解析2026五大AI营销增长引擎
人工智能
程序员老刘·14 小时前
重拾Eval能力:D4rt为Flutter注入AI进化基因
人工智能·flutter·跨平台开发·客户端开发
kebijuelun14 小时前
FlashInfer-Bench:把 AI 生成的 GPU Kernel 放进真实 LLM 系统的“闭环引擎”
人工智能·gpt·深度学习·机器学习·语言模型
Deepoch14 小时前
Deepoc具身模型开发板:让炒菜机器人成为您的智能厨师
人工智能·机器人·开发板·具身模型·deepoc·炒菜机器人·厨房机器人
Elastic 中国社区官方博客15 小时前
Elastic:DevRel 通讯 — 2026 年 1 月
大数据·数据库·人工智能·elasticsearch·搜索引擎·ai·全文检索
寻星探路15 小时前
【算法专题】滑动窗口:从“无重复字符”到“字母异位词”的深度剖析
java·开发语言·c++·人工智能·python·算法·ai
盈创力和200715 小时前
智慧城市中智能井盖的未来演进:从边缘感知节点到城市智能体
人工智能·智慧城市·智慧市政·智慧水务·智能井盖传感器·综合管廊
njsgcs15 小时前
ppo 找出口模型 训练笔记
人工智能·笔记
萤丰信息15 小时前
从 “钢筋水泥” 到 “数字神经元”:北京 AI 原点社区重构城市进化新逻辑
java·大数据·人工智能·安全·重构·智慧城市·智慧园区