动手学深度学习—网络中的网络NiN(代码详解)

news2024/10/2 20:33:13

目录

      • 1. NiN块
      • 2. NiN模型
      • 3. 训练模型

LeNet、AlexNet和VGG都有一个共同的设计模式:
通过一系列的卷积层与汇聚层来提取空间结构特征;然后通过全连接层对特征的表征进行处理。

如果在过程的早期使用全连接层,可能会完全放弃表征的空间结构。

而NiN(网络中的网络)提供了一个非常简单的解决方案:在每个像素的通道上分别使用多层感知机。

1. NiN块

卷积层的输入和输出由四维张量组成(样本,通道,高度,宽度)
全连接层的输入和输出通常是二维张量(样本,特征)

NiN在每个像素位置(针对每个高度和宽度)应用一个全连接层,可以将其视为1x1卷积层。将间维度中的每个像素视为单个样本,将通道维度视为不同特征。在这里插入图片描述
第一层为普通卷积层,之后的两个卷积层充当带有ReLU函数的逐像素全连接层。
NiN块

import torch
from torch import nn
from d2l import torch as d2l


# 定义NiN块,(输入通道,输出通道,核大小,步幅,填充)
def 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_size=1), nn.ReLU(),
        nn.Conv2d(out_channels, out_channels, kernel_size=1), nn.ReLU())

2. NiN模型

1、NiN使用窗口形状为11×11、5×5和3×3的卷积层,输出通道数量与AlexNet中的相同
2、每个NiN块后有一个最大汇聚层,汇聚窗口形状为3×3,步幅为2
3、取消了全连接层,使用一个NiN块,其输出通道数等于标签类别的数量
4、最后放一个全局平均汇聚层,生成一个对数几率

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),
                    # 标签类别
                    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)

在这里插入图片描述

3. 训练模型

定义精度评估函数

"""
    定义精度评估函数:
    1、将数据集复制到显存中
    2、通过调用accuracy计算数据集的精度
"""
def evaluate_accuracy_gpu(net, data_iter, device=None): #@save
    # 判断net是否属于torch.nn.Module类
    if isinstance(net, nn.Module):
        net.eval()
        
        # 如果不在参数选定的设备,将其传输到设备中
        if not device:
            device = next(iter(net.parameters())).device
    
    # Accumulator是累加器,定义两个变量:正确预测的数量,总预测的数量。
    metric = d2l.Accumulator(2)
    with torch.no_grad():
        for X, y in data_iter:
            # 将X, y复制到设备中
            if isinstance(X, list):
                # BERT微调所需的(之后将介绍)
                X = [x.to(device) for x in X]
            else:
                X = X.to(device)
            y = y.to(device)
            
            # 计算正确预测的数量,总预测的数量,并存储到metric中
            metric.add(d2l.accuracy(net(X), y), y.numel())
    return metric[0] / metric[1]

定义GPU训练函数

"""
    定义GPU训练函数:
    1、为了使用gpu,首先需要将每一小批量数据移动到指定的设备(例如GPU)上;
    2、使用Xavier随机初始化模型参数;
    3、使用交叉熵损失函数和小批量随机梯度下降。
"""
#@save
def train_ch6(net, train_iter, test_iter, num_epochs, lr, device):
    """用GPU训练模型(在第六章定义)"""
    # 定义初始化参数,对线性层和卷积层生效
    def init_weights(m):
        if type(m) == nn.Linear or type(m) == nn.Conv2d:
            nn.init.xavier_uniform_(m.weight)
    net.apply(init_weights)
    
    # 在设备device上进行训练
    print('training on', device)
    net.to(device)
    
    # 优化器:随机梯度下降
    optimizer = torch.optim.SGD(net.parameters(), lr=lr)
    
    # 损失函数:交叉熵损失函数
    loss = nn.CrossEntropyLoss()
    
    # Animator为绘图函数
    animator = d2l.Animator(xlabel='epoch', xlim=[1, num_epochs],
                            legend=['train loss', 'train acc', 'test acc'])
    
    # 调用Timer函数统计时间
    timer, num_batches = d2l.Timer(), len(train_iter)
    
    for epoch in range(num_epochs):
        
        # Accumulator(3)定义3个变量:损失值,正确预测的数量,总预测的数量
        metric = d2l.Accumulator(3)
        net.train()
        
        # enumerate() 函数用于将一个可遍历的数据对象
        for i, (X, y) in enumerate(train_iter):
            timer.start() # 进行计时
            optimizer.zero_grad() # 梯度清零
            X, y = X.to(device), y.to(device) # 将特征和标签转移到device
            y_hat = net(X)
            l = loss(y_hat, y) # 交叉熵损失
            l.backward() # 进行梯度传递返回
            optimizer.step()
            with torch.no_grad():
                # 统计损失、预测正确数和样本数
                metric.add(l * X.shape[0], d2l.accuracy(y_hat, y), X.shape[0])
            timer.stop() # 计时结束
            train_l = metric[0] / metric[2] # 计算损失
            train_acc = metric[1] / metric[2] # 计算精度
            
            # 进行绘图
            if (i + 1) % (num_batches // 5) == 0 or i == num_batches - 1:
                animator.add(epoch + (i + 1) / num_batches,
                             (train_l, train_acc, None))
                
        # 测试精度
        test_acc = evaluate_accuracy_gpu(net, test_iter) 
        animator.add(epoch + 1, (None, None, test_acc))
        
    # 输出损失值、训练精度、测试精度
    print(f'loss {train_l:.3f}, train acc {train_acc:.3f},'
          f'test acc {test_acc:.3f}')
    
    # 设备的计算能力
    print(f'{metric[2] * num_epochs / timer.sum():.1f} examples/sec'
          f'on {str(device)}')

在这里插入图片描述

训练模型

# 训练模型
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())

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1128629.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Unsupervised Medical Image Translation with Adversarial Diffusion Models

基于对抗扩散模型的无监督医学图像翻译 论文链接:https://arxiv.org/abs/2207.08208 项目链接:https://github.com/icon-lab/SynDiff Abstract 通过源-目标模态转换对缺失图像进行补全可以提高医学成像方案的多样性。利用生成对抗网络(GAN)进行一次映…

string类型数据的基本操作

1.string类型的基本操作 2.string类型数据的扩展操作 2.1 增加和减少 2.2 控制数据的生命周期 3.string类型数据操作的注意事项

nginx中gzip推荐配置

#开启gzip压缩功能 gzip on; #设置允许压缩的页面最小字节数; 这里表示如果文件小于10个字节,就不用压缩,因为没有意义,本来就很小. gzip_min_length 10k; #设置压缩缓冲区大小,此处设置为4个16K内存作为压缩结果流缓存 gzip_buffers 4 16k;#压缩版本 gzip_http_version 1…

PDCA项目开发环境搭建说明

PDCA项目开发环境搭建说明 环境准备 JDK 15.0 ; IDEA Community Edition 2021.3 版本要对应,不然会报错 Jdk 安装步骤:https://blog.csdn.net/qq_34913677/article/details/108894727 IDea 安装说明:https://blog.csdn.net/dream…

使用项目管理系统优化公众号文章排期

微信公众号已经成为众多企业进行内容营销的关键平台,然而要在这片竞争激烈的领域中脱颖而出,赢得更多的流量和用户关注,仅仅依靠高质量的内容是远远不够的。使用Zoho Projects项目管理系统,帮助您实现文章发布的精细化管理是一个不…

“荷风常盛·非遗中国传承大会”在京召开,北京市珐琅厂隆重发布国事作品《荷风常盛·中国禧》

“荷风常盛非遗中国传承大会”于10月21日在北京雁栖湖圆满举办。大会由中国景泰蓝第一家北京市珐琅厂、北京设计学会主办。期间由北京市珐琅厂出品的景泰蓝《荷风常盛中国禧》首次亮相,惊艳与会的各界艺术文化领导、专家、学者,以及一带一路国家驻华使节…

C++常用标准算法

算法主要由头文件<algorithm>、<functional>、<numeric>组成。 <algorithm>是所有STL头文件中最大的一个&#xff0c;范围涉及到比较、交换、查找、遍历、赋值、修改等等&#xff1b;<numeric>体积很小&#xff0c;只包括几个在序列上面进行简单…

【@EnableWebMvc的原理】

用途 启用SpringMvc 的 Java 配置类&#xff0c;代替 xml 格式的配置文件。 一、查看运用&#xff08;注解 EnableWebMvc &#xff0c;实现 WebMvcConfigurer &#xff09; Component("com.ibicd") EnableWebMvc public class AppConfig implements WebMvcConfigu…

Ceres 使用笔记

文章目录 Part.I IntroductionChap.I 预备知识Chap.II 概念理解 Part.II 简单使用Chap.I Ceres 中主要函数简介Chap.II 一个简单的实例 Reference Part.I Introduction Ceres 1 是由 Google 开发的开源 C 通用非线性优化库&#xff0c;与 g2o 并列为目前视觉 SLAM 中应用最广泛…

GRE和MGRE笔记

目录 前言&#xff1a; 一、VPN 1、技术背景&#xff1a; 2、作用&#xff1a; 3、优势&#xff1a; 4、隧道技术 5、分类 二、GRE 1、GRE简介&#xff1a; 2、GRE VPN&#xff1a; 3、GRE报文结构 4、GRE VPN工作过程 5、GRE VPN 的优缺点&#xff1a; 6、多Tun…

Java访问修饰符private、default、protected、public的区别

Java有四种访问权限&#xff0c;其中三种有访问权限修饰符&#xff0c;分别为private&#xff0c;public和protected&#xff0c;还有一种不带任何修饰符&#xff1a; 1、private&#xff0c;私有的&#xff0c;被private修饰的类、方法、属性、只能被本类的对象所访问。我什么…

订水商城H5实战教程-03用户协议

目录 1 创建页面2 为文本组件增加事件3 检查用户协议是否勾选最终效果 我们上一篇介绍了打开首页时弹出登录窗口的功能&#xff0c;本篇我们实现一下用户协议。 1 创建页面 功能是点击用户协议的时候打开具体的协议内容&#xff0c;需要先创建一个页面。打开自定义应用&#x…

云原生之深入解析Kubernetes集群内的服务通信机制

一、传统的服务到服务通信 先了解一下支持服务间通信的 3 个原生 K8s 对象&#xff1a;ClusterIP Service、DNS 和 Kube-Proxy&#xff1a; 在进入 Kubernetes 生态系统之前&#xff0c;快速了解一下传统的服务到服务通信&#xff1a;通信是通过 IP 地址进行的&#xff0c;因此…

数组对象深拷贝

多层嵌套的数组对象使用扩展运算符原数组依然被修改&#xff1a; let arr [{name:a,num:1,children:[{name:a1,num:1,},{name:a2,num:2,},{name:a3,num:3,}]},{name:b,num:1,children:[{name:b1,num:1,},{name:b2,num:2,}]}] let arr2 [...arr] arr2[0].children.splice(1,1…

5.MySQL基本查询

个人主页&#xff1a;Lei宝啊 愿所有美好如期而遇 目录 表的增删改查 Create 单行数据 全列插入 多行数据 指定列插入 插入否则更新 替换 Retrieve SELECT 列 全列查询 指定列查询 查询字段为表达式 为查询结果指定别名 结果去重 WHERE 条件 结果排序 筛…

xhadmin多应用Saas框架之超级SEO应用介绍

xhadmin是什么&#xff1f; xhadmin 是一套基于最新技术的研发的多应用 Saas 框架&#xff0c;支持在线升级和安装模块及模板&#xff0c;拥有良好的开发框架、成熟稳定的技术解决方案、提供丰富的扩展功能。为开发者赋能&#xff0c;助力企业发展、国家富强&#xff0c;致力于…

香飘飘的想象空间:全面创新驱动外延与内涵双增长,未来可期

面对时常会发生代际更替的消费者主力群体&#xff0c;创新已经成为一种商业上的必须。 日前&#xff0c;香飘飘发布了三季报&#xff0c;数据显示&#xff0c;第三季度&#xff0c;香飘飘营业收入8.08亿元&#xff0c;同比增长20.41%。前三季度&#xff0c;香飘飘营收19.79亿元…

制药企业固体制剂设备管理及维护要点

在制药企业的生产过程中&#xff0c;固体制剂设备是至关重要的一环。有效管理和维护这些设备对于确保生产质量、提高生产效率以及延长设备寿命至关重要。本文将从以下三个方面介绍制药企业固体制剂设备的主要类型、常见管理问题以及设备维护的关键要点。 制药企业固体制剂设备主…

基于蝴蝶算法的无人机航迹规划-附代码

基于蝴蝶算法的无人机航迹规划 文章目录 基于蝴蝶算法的无人机航迹规划1.蝴蝶搜索算法2.无人机飞行环境建模3.无人机航迹规划建模4.实验结果4.1地图创建4.2 航迹规划 5.参考文献6.Matlab代码 摘要&#xff1a;本文主要介绍利用蝴蝶算法来优化无人机航迹规划。 1.蝴蝶搜索算法 …

C# Winform编程(9)网络编程

网络编程 HTTP网络编程IPAddress IP地址类WebClient类WebRequest类和WebResponse类 WebBrowser网页浏览器控件TCP网络编程TcpClient类TcpListener类NetworkStream类Socket类 HTTP网络编程 IPAddress IP地址类 IPAddress类代表IP地址&#xff0c;可在十进制表示法和实际的整数…