当前位置: 首页 > news >正文

多层感知机从0开始实现

《动手学深度学习》-4.2-笔记

  • 多层感知机在输出层和输入层之间增加一个或多个全连接隐藏层,并通过激活函数转换隐藏层的输出。

  • 常用的激活函数包括ReLU函数、sigmoid函数和tanh函数。

  • import torch
    from torch import nn
    from d2l import torch as d2l
    
    batch_size = 256
    train_iter, test_iter = d2l.load_data_fashion_mnist(batch_size)

    分析 :导入fashion_ minist数据集(图像数据集处理可以参考3.5

  • num_inputs, num_outputs, num_hiddens = 784, 10, 256
    
    W1 = nn.Parameter(torch.randn(
        num_inputs, num_hiddens, requires_grad=True) * 0.01)
    b1 = nn.Parameter(torch.zeros(num_hiddens, requires_grad=True))
    W2 = nn.Parameter(torch.randn(
        num_hiddens, num_outputs, requires_grad=True) * 0.01)
    b2 = nn.Parameter(torch.zeros(num_outputs, requires_grad=True))
    
    params = [W1, b1, W2, b2]

    定义输入、输出和隐藏层的维度:784个输入特征 和10个类的简单分类数据集,隐藏层的维度为256,
    定义网络参数:W1b1 是第一层(输入层到隐藏层)的权重和偏置:

  • torch.randn(num_inputs, num_hiddens):生成一个形状为 (784, 256) 的张量,其元素从标准正态分布(均值为 0,标准差为 1)中随机采样。

    W2b2 是第二层(隐藏层到输出层)的权重和偏置:

  • torch.randn(num_hiddens, num_outputs):生成一个形状为 (256, 10) 的张量,其元素从标准正态分布中随机采样。

    def relu(X):
        a = torch.zeros_like(X)
        return torch.max(X, a)
    

    将实现ReLU激活函数, 

模型

def net(X):
    X = X.reshape((-1, num_inputs))
    H = relu(X@W1 + b1)  # 这里“@”代表矩阵乘法
    return (H@W2 + b2)
  1. 输入数据 X 被重塑为 (batch_size, num_inputs) 的形状。

  2. 第一层(输入层到隐藏层)的计算:H = relu(X@W1 + b1),其中 relu 是激活函数。

  3. 第二层(隐藏层到输出层)的计算:output = H@W2 + b2,返回输出层的结果。

损失函数 

loss = nn.CrossEntropyLoss(reduction='none')

 使用了 PyTorch 的 nn.CrossEntropyLoss 来定义一个损失函数,并且通过 reduction='none' 参数指定了损失的计算方式。

  • reduction='none' 表示损失函数会为每个样本单独计算损失值,返回一个形状为 (batch_size,) 的张量,其中每个元素对应一个样本的损失值。

num_epochs, lr = 10, 0.1
updater = torch.optim.SGD(params, lr=lr)
d2l.train_ch3(net, train_iter, test_iter, loss, num_epochs, updater)

定义了训练的轮数、学习率,并使用随机梯度下降(SGD)优化器来更新网络参数,最后调用一个训练函数来执行训练和评估过程。
d2l.train_ch3 是一个封装好的函数,内部逻辑

  1. 初始化

    • 初始化训练和测试的损失、准确率等指标。

  2. 训练循环

    • 遍历每个训练轮数(num_epochs)。

    • 在每个训练轮中:

      • 遍历训练数据迭代器(train_iter),逐批次获取训练数据。

      • 对每个批次的数据:

        • 前向传播:通过网络模型(net)计算输出。

        • 计算损失:使用损失函数(loss)计算模型输出与真实标签之间的损失。

        • 反向传播:计算梯度。

        • 参数更新:使用优化器(updater)更新网络参数。

      • 记录训练损失和准确率。

  3. 测试

    • 在每个训练轮结束后,使用测试数据迭代器(test_iter)评估模型的性能。

    • 计算测试损失和准确率。

  4. 输出

    • 打印每个训练轮的训练损失、训练准确率、测试损失和测试准确率。报错,修改:要解决这个问题,需要确保在调用 backward() 之前,损失值是一个标量。将损失函数的 reduction 参数改为 'mean''sum',这样损失函数会返回一个标量值,而不是一个张量。

 d2l.predict_ch3 是一个函数,通常来自 Dive into Deep Learning (D2L) 教程库,用于对测试数据进行预测并展示预测结果。它的主要作用是使用训练好的神经网络模型对测试数据进行分类预测,并将预测结果与真实标签进行对比,以便直观地评估模型的性能。

相关文章:

  • Java设计模式之解释器模式
  • ofd转pdf报错:org.ofdrw.reader.ZipUtil.unZipFileByApacheCommonCompress【已解决】
  • web爬虫笔记:js逆向案例十一 某数cookie(补环境流程)
  • C#委托介绍
  • 算法数论.3(拓展欧几里得,中国剩余定理)
  • 搭建第一个Spring项目
  • 题解:AT_abc170_f [ABC170F] Pond Skater
  • Linux中执行 ifconfig 命令时提示 “未找到命令”
  • 无人设备遥控器之调度自动化技术篇
  • MCP(大模型上下文协议)
  • C++ 的基本内置类型(十二)
  • springboot body 转对象强验证属性多余属性抛错误
  • [NO-WX179]基于springboot+微信小程序的在线选课系统
  • msvcp140.dll是什么文件?修复丢失msvcp140.dll的方法指南
  • Python FastAPI 面试题及参考答案
  • [CLS] Token 在 ViT(Vision Transformer)中的作用与实现
  • 模拟算法专题
  • 机器学习实战,涉及数据预处理、监督算法、无监督算法、模型评估与改进-思维导图
  • 【2025年第三期】全国数字人才技能提升师资培训班邀请函
  • LangChain其它五类组件详解(6)—— 查询分析(Query analysis)
  • 韩国第二大轮胎制造商因火灾停产,或影响700万条轮胎销售
  • 专访《风雪夜归人》导演闫锐:在舞台上表现什么是真正的活着
  • 特朗普与普京开始进行电话会谈,稍后还将致电泽连斯基
  • 今晚油价下调,加满一箱油将省9元
  • AI快速迭代带来知识焦虑,褚君浩院士提出“四维能力模型”
  • 英国知名歌手批政府:让AI公司免费使用艺术家作品是盗窃