昇思25天学习打卡营第7天|深度学习流程全解析:从模型训练到评估

news2024/10/7 7:25:04

目录

构建数据集

定义神经网络模型

定义超参、损失函数和优化器

超参

损失函数

优化器

训练与评估


构建数据集


        首先从数据集 Dataset加载代码,构建数据集。

        代码如下:

#引入了必要的库和模块,像 mindspore 以及相关的数据处理模块等等。  
import mindspore  
from mindspore import nn  
from mindspore.dataset import vision, transforms  
from mindspore.dataset import MnistDataset  
# Download data from open datasets  
#定义了一个下载函数,用于从特定的 url 下载 MNIST 数据集的压缩文件,并明确了保存路径。  
from download import download  
url = "https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/" \  
      "notebook/datasets/MNIST_Data.zip"  
path = download(url, "./", kind="zip", replace=True)  
#定义了一个叫做 datapipe 的函数,这个函数是用来处理数据集的。  
def datapipe(path, batch_size):  
     #定义了一个名为 image_transforms 的列表  
    image_transforms = [  
        #将图像的像素值缩放到 0 到 1 的范围  
        vision.Rescale(1.0 / 255.0, 0),  
        #对图像进行标准化处理,使用给定的均值和标准差  
        vision.Normalize(mean=(0.1307,), std=(0.3081,)),  
        #改变图像的数据布局  
        vision.HWC2CHW()  
    ]  
    #定义了一个名为 label_transform 的操作,用于将标签转换为 mindspore.int32 类型。  
    label_transform = transforms.TypeCast(mindspore.int32)  
    #通过 MnistDataset 类读取指定路径的数据集。  
    dataset = MnistDataset(path)  
    #使用 map 方法对数据集中的图像应用 image_transforms 中的变换操作,对标签应用 label_transform 操作。  
    dataset = dataset.map(image_transforms, 'image')  
    dataset = dataset.map(label_transform, 'label')  
    #使用 batch 方法将数据集按照指定的 batch_size 进行分批处理。  
    dataset = dataset.batch(batch_size)  
    #函数返回处理后的数据集。  
    return dataset  

        运行结果:

        使用 datapipe 函数分别对训练集和测试集进行处理。为训练集和测试集指定了不同的路径,然而批大小均为 64 。处理结束后,将所得结果分别存放在 train_dataset 和 test_dataset 这两个变量当中,以便后续用于模型的训练与测试。

定义神经网络模型


        从网络构建中加载代码,构建一个神经网络模型。

        代码如下:

class Network(nn.Cell):  
    def __init__(self):  
        super().__init__()  
        self.flatten = nn.Flatten()  
        self.dense_relu_sequential = nn.SequentialCell(  
            nn.Dense(28*28, 512),  
            nn.ReLU(),  
            nn.Dense(512, 512),  
            nn.ReLU(),  
            nn.Dense(512, 10)  
        )  
  
    def construct(self, x):  
        x = self.flatten(x)  
        logits = self.dense_relu_sequential(x)  
        return logits  
  
model = Network()  

        分析:这段代码定义了一个名为 Network 的类,它继承自 nn.Cell 。

        在 __init__ 方法(构造方法)中:

        调用了父类的构造方法。

        定义了一个 nn.Flatten 层用于展平输入数据。

        定义了一个名为 dense_relu_sequential 的序列层,其中包含了三个全连接层(nn.Dense)和两个 ReLU 激活函数层。

        在 construct 方法(前向传播方法)中,首先使用 flatten 层对输入 x 进行展平操作,然后将展平后的结果传入 dense_relu_sequential 序列层得到预测结果 logits 并返回。

        最后,创建了一个 Network 类的实例并将其赋值给 model 变量。

定义超参、损失函数和优化器


超参

        超参是可调节的参数,能掌控模型训练优化的进程,不同值可能影响模型训练与收敛速度。现今,深度学习模型多采用批量随机梯度下降算法优化。

        就优化来说,超参是影响模型性能收敛的关键。常见的训练超参有:

        训练轮次(epoch):指训练中遍历数据集的次数。

        批次大小(batch size):数据集分批训练,其每个批次数据的大小就是 batch size 。过小则耗时且梯度震荡,不利收敛;过大则梯度方向不变,易陷局部极小值。所以要选合适的 batch size ,以提升精度和实现全局收敛。

        学习率(learning rate):偏小会使收敛变慢,偏大可能导致训练不收敛等问题。梯度下降法常用于模型误差的参数优化,通过多次迭代和最小化损失函数预估参数,学习率控制着迭代中的学习进程。

        代码如下:

#训练轮次设置为 3 次。  
epochs = 3  
#批次大小设定为 64 。  
batch_size = 64  
#学习率设置为 0.01 (1e-2 表示 10 的 -2 次方,即 0.01 )  
learning_rate = 1e-2  

损失函数

        损失函数(loss function)用于衡量模型的预测值(logits)与目标值(targets)之间的偏差。在训练模型之初,随机初始化的神经网络模型往往会给出错误的预测结果。损失函数会评判预测结果和目标值的差异程度,模型训练的目的就是减小损失函数所计算出的误差。

        常见的损失函数有用于回归任务的 nn.MSELoss(均方误差)和用于分类的 nn.NLLLoss(负对数似然)等。nn.CrossEntropyLoss 融合了 nn.LogSoftmax 和 nn.NLLLoss,能够对 logits 进行标准化并计算预测误差。

        代码如下:

loss_fn = nn.CrossEntropyLoss()  

        分析:定义了一个损失函数变量 loss_fn ,并将其赋值为 nn.CrossEntropyLoss() ,即使用了 PyTorch 库中用于计算交叉熵损失的函数。在后续的模型训练中,会使用这个定义好的损失函数来计算模型预测结果与真实标签之间的误差。

优化器

        模型优化(Optimization)是于每个训练步骤中调整模型参数以降低模型误差的过程。MindSpore 提供多种优化算法的实现,称为优化器(Optimizer)。优化器内部界定了模型的参数优化流程(即梯度如何更新至模型参数),所有优化逻辑皆封装于优化器对象内。在此,我们运用 SGD(Stochastic Gradient Descent)优化器。

        我们借助 model.trainable_params()方法获取模型的可训练参数,并输入学习率超参来初始化优化器。

        代码如下:

optimizer = nn.SGD(model.trainable_params(), learning_rate=learning_rate)  

        分析:定义了一个优化器变量 optimizer ,使用了 PyTorch 中的随机梯度下降(Stochastic Gradient Descent,简称 SGD)优化器。它通过 model.trainable_params() 方法获取模型中可训练的参数,并将学习率设置为 learning_rate 这个变量所指定的值来初始化优化器。

训练与评估


        第一步:定义了模型训练的相关函数和训练循环的逻辑。包括前向传播计算损失、获取梯度、单步训练以及整个训练过程的循环,并定期打印损失信息。

        代码如下:

# 定义前向传播函数  
def forward_fn(data, label):  
    # 模型对输入数据进行预测得到预测值 logits  
    logits = model(data)  
    # 根据预测值和真实标签计算损失  
    loss = loss_fn(logits, label)  
    # 返回损失和预测值  
    return loss, logits  
# 获取梯度计算函数  
grad_fn = mindspore.value_and_grad(forward_fn, None, optimizer.parameters, has_aux=True)  
# 定义单步训练的函数  
def train_step(data, label):  
    # 调用梯度计算函数,得到损失和辅助信息,并计算梯度  
    (loss, _), grads = grad_fn(data, label)  
    # 优化器根据梯度更新模型参数  
    optimizer(grads)  
    # 返回损失值  
    return loss  
def train_loop(model, dataset):  
    # 获取数据集的大小  
    size = dataset.get_dataset_size()  
    # 设置模型为训练模式  
    model.set_train()  
    # 遍历数据集中的批次  
    for batch, (data, label) in enumerate(dataset.create_tuple_iterator()):  
        # 执行单步训练并获取损失值  
        loss = train_step(data, label)  
        # 每 100 个批次打印一次损失信息  
        if batch % 100 == 0:  
            loss, current = loss.asnumpy(), batch  
            print(f"loss: {loss:>7f}  [{current:>3d}/{size:>3d}]")  

        第二步:定义了一个测试循环的函数,用于在给定的数据集上对模型进行测试评估。计算了测试数据的平均损失和准确率,并打印出测试结果。

        代码如下:

def test_loop(model, dataset, loss_fn):  
    # 获取数据集中的批次数  
    num_batches = dataset.get_dataset_size()  
    # 设置模型为评估模式(非训练模式)  
    model.set_train(False)  
    # 初始化一些统计变量  
    total, test_loss, correct = 0, 0, 0  
    # 遍历数据集中的数据和标签  
    for data, label in dataset.create_tuple_iterator():  
        # 模型对输入数据进行预测  
        pred = model(data)  
        # 累计数据的数量  
        total += len(data)  
        # 累计损失值  
        test_loss += loss_fn(pred, label).asnumpy()  
        # 计算预测正确的数量  
        correct += (pred.argmax(1) == label).asnumpy().sum()  
    # 计算平均损失  
    test_loss /= num_batches  
    # 计算准确率  
    correct /= total  
    # 打印测试结果  
    print(f"Test: \n Accuracy: {(100*correct):>0.1f}%, Avg loss: {test_loss:>8f} \n")  

        第三步:进行了模型的训练和测试。首先定义了损失函数和优化器,然后按照设定的轮次数进行训练和测试,每一轮都打印轮次信息,最后打印训练完成的提示。

        代码如下:

loss_fn = nn.CrossEntropyLoss()  # 定义交叉熵损失函数  
optimizer = nn.SGD(model.trainable_params(), learning_rate=learning_rate)  # 定义随机梯度下降优化器,并传入模型的可训练参数和学习率  
for t in range(epochs):  # 进行多个训练轮次  
    print(f"Epoch {t+1}\n-------------------------------")  # 打印当前轮次信息  
    train_loop(model, train_dataset)  # 执行训练循环  
    test_loop(model, test_dataset, loss_fn)  # 执行测试循环  
print("Done!")  # 打印训练完成的提示  

        运行结果:

Epoch 1  
-------------------------------  
loss: 0.250805  [  0/938]  
loss: 0.130063  [100/938]  
loss: 0.074891  [200/938]  
loss: 0.330714  [300/938]  
loss: 0.298072  [400/938]  
loss: 0.177415  [500/938]  
loss: 0.469457  [600/938]  
loss: 0.380078  [700/938]  
loss: 0.225529  [800/938]  
loss: 0.200035  [900/938]  
Test:   
 Accuracy: 93.9%, Avg loss: 0.207253   
  
Epoch 2  
-------------------------------  
loss: 0.289100  [  0/938]  
loss: 0.328313  [100/938]  
loss: 0.138099  [200/938]  
loss: 0.096204  [300/938]  
loss: 0.162835  [400/938]  
loss: 0.335097  [500/938]  
loss: 0.134196  [600/938]  
loss: 0.332896  [700/938]  
loss: 0.261795  [800/938]  
loss: 0.154485  [900/938]  
Test:   
 Accuracy: 94.6%, Avg loss: 0.181880   
  
Epoch 3  
-------------------------------  
loss: 0.338207  [  0/938]  
loss: 0.171585  [100/938]  
loss: 0.223193  [200/938]  
loss: 0.174970  [300/938]  
loss: 0.246406  [400/938]  
loss: 0.149053  [500/938]  
loss: 0.281349  [600/938]  
loss: 0.109779  [700/938]  
loss: 0.261625  [800/938]  
loss: 0.060637  [900/938]  
Test:   
 Accuracy: 95.2%, Avg loss: 0.158948   
  
Done!  

      运行截图:

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

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

相关文章

初识Spark

一、简介 官网:Apache Spark™ - Unified Engine for large-scale data analytics Apache的顶级项目,用于大规模数据处理的统一分析引擎。 支持语言:Java、Scala、Python和R (源码为Scala) 高级工具: 1、SparkSQL用于SQL和结构…

IDEA开发必备的插件,实测非常好用

1、Lombok -- 简化Java代码开发 推荐指数: ★★★★★ Lombok:首当其冲的非常推荐的当然是Lombok Lombok能以简单的注解形式来简化Java代码,提高开发人员的开发效率。例如开发中经常需要写的JavaBean,都需要花时间去添加相应的ge…

如何在忘记密码的情况下删除华为ID激活锁

当您手中拥有最新的华为手机时,您会忍不住探索新的可能性,以从您的设备中获得最大价值。您可以下载新的应用程序、Android 启动器等,但这些应用程序中的大多数都会给您的手机带来错误和安全威胁,如果不恢复出厂设置,可…

对标 GPT-4o 的开源实时语音多模态模型:Moshi

是由法国的 AI 实验室 Kyutai 推出的实时语音多模态模型,支持听、说、看,最关键的是你现在就可以在浏览器中使用,如果这个链接延迟高,可以试试这个, 无需输入邮箱,点击 Join queue 即可。 简单体验了下,比…

自学新标日第十七课(已完结)

第十七课 单词 单词假名声调词义洋服ようふく0西服セーター1毛衣ノートバソコン4笔记本电脑バイク1摩托车お汁粉おしるこ2年糕小豆汤天ぷらてんぷら0天麩羅初詣はつもうで3新年后首次参拜健康けんこう0健康恋愛れんあい0恋爱相手…

springboot 整合 mybatis-plus

一.前言 1. mybatis-plus是什么 mybatis-plus是一个对mybati框架的拓展框架,它在mybatis框架基础上做了许多的增强,帮助我们快速的进行代码开发。目前企业开发中,使用mybati的项目基本会选择使用mybatis-plus来提升开发效率。 2.官网地址&…

机器学习:预测评估8类指标

机器学习:8类预测评估指标 R方值、平均值绝对误差值MAE、均方误差MSE、均方误差根EMSE、中位数绝对误差MAD、平均绝对百分误差MAPE、可解释方差分EVS、均方根对数误差MLSE。 一、R方值 1、说明: R方值,也称为确定系数或拟合优度&#xff…

3099.力扣每日一题7/3 Java(击败100%)

博客主页:音符犹如代码系列专栏:算法练习关注博主,后期持续更新系列文章如果有错误感谢请大家批评指出,及时修改感谢大家点赞👍收藏⭐评论✍ 目录 思路 解题方法 时间复杂度 空间复杂度 Code 思路 首先要解决如何…

MobileVitv1替换yolov8主干网络

一、原理介绍 MobileViT模型是为移动设备设计的轻量级、通用目的视觉变换器。它融合了卷积神经网络(CNN)和视觉变换器(ViT)的优势,旨在在保持高效性能的同时减少模型参数和降低延迟。以下是关于MobileViT模型的主要原理…

2024企业数据资产化及数据资产入表方案梳理

01 数据资产入表:是一个将组织的各类数据资产进行登记、分类、评估和管理的流程。 数据资产包括:客户信息、交易记录、产品数据、财务数据等。 做个比喻吧:数据资产入表就像是给公司的数据资产做“人口普查”—— ①找出公司有哪些数据找…

在uni-app使用vue3使用vuex

在uni-app使用vue3使用vuex 1.在项目目录中新建一个store目录,并且新建一个index.js文件 import { createStore } from vuex;export default createStore({//数据,相当于datastate: {count:1,list: [{name: 测试1, value: test1},{name: 测试2, value: …

【DataSophon】DataSophon1.2.1服务组件开启 kerberos

目录 一、DataSophon是什么 1.1 DataSophon概述 1.2 架构概览 1.3 设计思想 二、集成组件 三、环境准备 四、安装kerberos服务 4.1 Zookeeper 4.2 HDFS 4.3 HBase 4.4 YARN 4.5 hive 【DataSophon】大数据管理平台DataSophon-1.2.1安装部署详细流程-CSDN博客 【Da…

Qt中udp指令,大小端,帧头帧尾实际示例

前言 虽然QT中,udp发送和接收,其实非常简单,但是实际工作中,其实涉及到帧头帧尾,字节对齐,以及大小端序的问题。比如网络中,正规的一般都是大端序,而不是小端序,大多数的…

2024鲲鹏昇腾创新大赛集训营Ascend C算子学习笔记

异构计算架构(CANN) 对标英伟达的CUDA CuDNN的核心软件层,向上支持多种AI框架,向下服务AI处理器,发挥承上启下的关键作用,是提升昇腾AI处理器计算效率的关键平台。主要包括有各种引擎、编译器、执行器、算…

mac磁盘工具如何合并分区 macos 磁盘工具 无法抹除 磁盘管理软件哪个使用率最高

一、什么是NTFS格式分区 NTFS格式分区是微软公司开发的诸多文件系统中的一种。NTFS格式分区是一种文件系统,磁盘只有在安装了文件系统后才能被正常使用,文件系统的格式有非常多,常见的有FAT 32和NTFS。 作为常见文件系统,NTFS格式…

Conmi的正确答案——ESP32-C3开启安全下载模式

IDF版本:4.4.7 注意事项:一旦烧录“安全下载模式”,模组将无法被读取或清理,只能通过eclipse原项目烧录程序进行重新烧录,无法再烧录其他固件。 20240703110201——追加解法,暂时无法解安全下载模式 &…

Python数据分析-股票数据分析(GARCH模型)

一、研究背景 随着金融市场的不断发展和全球经济的日益复杂,市场波动性和风险管理成为投资者和金融机构关注的焦点。波动率是衡量市场风险的重要指标,准确预测和评估波动率对于资产定价、风险控制和投资决策具有重要意义。在金融时间序列分析中&#xf…

上海会议论坛可以邀请哪些媒体?

传媒如春雨,润物细无声,大家好,我是51媒体网胡老师。 上海会议论坛可以邀请的媒体包括电视媒体、报纸媒体、网络媒体、视频媒体以及专业的媒体邀约机构。具体介绍如下: 电视媒体:上海的第一财经频道和东方财经频道等&…

《python程序语言设计》2018版第5章第51题利用turtle画18x18的格子

05.51.01version 先从第一一个格子来做 turtle.right(45) turtle.circle(18, steps4) turtle.hideturtle() turtle.done()这个代码很简单的现实出格子的样式。 现在的问题是循环的话。首先角度45度怎么处理 随着45度一次一次迭代。他是应该转4590呢还是4545呢?&…

【Mac】Boxy SVG for Mac(矢量图编辑器)及同类型软件介绍

软件介绍 Boxy SVG 是一款功能强大的矢量图形编辑器,专门为 macOS 平台设计开发。它主要用于创建和编辑 SVG(可缩放矢量图形)文件,是设计师和开发者们制作矢量图形的理想工具。 以下是关于 Boxy SVG 的主要特点和功能&#xff1a…