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

目录

构建数据集

定义神经网络模型

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

超参

损失函数

优化器

训练与评估


构建数据集


        首先从数据集 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.mfbz.cn/a/769526.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

vue高德地图使用

先根据官方方法给vue项目引入高德 高德文档地址 做好准备后使用 初始化地图 AMap.plugin(AMap.MoveAnimation, () >{//地图this.map new AMap.Map("mapContainer", {resizeEnable: true,center: [116.397447,39.909176],//地图中心坐标zoom:12,//缩放值});this.…

《NATURE丨使用 AlphaFold 3 准确预测生物分子相互作用的结构》

NATURE丨使用 AlphaFold 3 准确预测生物分子相互作用的结构 注意!:本文创作仅根据个人理解和网络信息,如有错误恳请指正!谢谢! 大家好,今天分享的文献是2024年5月发表在Nature上的“ Accurate structure …

Qt/C++编写地图应用/离线地图下载/路径规划/轨迹回放/海量点/坐标转换

一、前言说明 这个地图组件写了很多年了,最初设计的比较粗糙,最开始只是为了满足项目需要,并没有考虑太多拓展性,比如最初都是按照百度地图写死在代码中,经过这几年大量的现场实际应用,以及大量的用户提出…

深度学习标注文件格式转换

json转xml 原始数据集文件夹中图片格式为bmp&#xff0c;标注文件为json&#xff0c;图片和标注文件放在同一个文件夹下面&#xff0c;将json转为xml格式&#xff0c;图片和标注文件分别存放在一个文件夹下面。 headstr """\ <annotation><folder>…

C语言 -- 函数

C语言 -- 函数 1. 函数的概念2. 库函数2.1 标准库和头文件2.2 库函数的使用方法2.2.1 功能2.2.2 头文件包含2.2.3 实践2.2.4 库函数文档的一般格式 3. 自定义函数3.1 函数的语法形式3.2 函数的举例 4. 形参和实参4.1 实参4.2 形参4.3 实参和形参的关系 5. return 语句6. 数组做…

页面加载503 Service Temporarily Unavailable异常

最近发现网页刷新经常503&#xff0c;加载卡主&#xff0c;刷新页面就正常了。 研究之后发现是页面需要的js文件等加载失败了。 再研究之后发现是nginx配置的问题。 我之前为了解决一个漏洞检测到目标主机可能存在缓慢的HTTP拒绝服务攻击 把nginx的连接设置了很多限制&#…

通过easyexcel导入数据,添加表格参数的校验,同表格内校验以及和已有数据的校验

引入依赖 <dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>2.2.11</version><scope>compile</scope></dependency> 需要导入到某个目录下 如果产品名称相同&#xff0c…

这玩意终于有免费的了———Navicat Premium Lite

免费啦&#xff01;&#xff01;&#xff01;X&#xff01;&#xff01;&#xff01; 免费啦&#xff01;&#xff01;&#xff01;X&#xff01;&#xff01;&#xff01; 免费啦&#xff01;&#xff01;&#xff01;X&#xff01;&#xff01;&#xff01; 去下载吧&…

基于Teager-Kaiser能量算子的肌电信号降噪方法(MATLAB)

Teager-Kaiser能量算子是一种非线性算子&#xff0c;它能有效提取信号的瞬时能量&#xff0c;对信号瞬时变化具有良好的时间分辨率。Teager-Kaiser能量算子只需信号三个采样点&#xff0c;即可快速跟踪信号的幅值和角频率变化&#xff0c;计算实现简单、运算量小。 clc clear a…

【 香橙派 AIpro评测】大语言模型实战教程:香橙派 AIpro部署LLMS大模型实站(保姆级教学)

引言 OrangePi AIpro 这块板子作为业界首款基于昇腾深度研发的AI开发板&#xff0c;一经发布本博主就火速去关注了&#xff0c;其配备的 8/20TOPS澎湃算力是目前开发板市场中所具备的最大算力&#xff0c;可谓是让我非常眼馋啊&#xff01;这么好的板子那必须拿来用用&#xff…

WPF 3D绘图 点云 系列五

基本概念:点云是某个坐标系下的点的数据集。 可能包含丰富的信息,包括三维坐标X,Y,Z、颜色、分类值、强度值、时间等等 点云可以将现实世界原子化,通过高精度的点云数据可以还原现实世界。万物皆点云。 通过三维激光扫描仪进行数据采集获取点云数据,其次通过二维影像进行…

初次使用GitHub教程入门

注册一个github账户 访问地址&#xff1a;https://github.com/&#xff0c;点击右上角sign up&#xff0c;录入以下信息&#xff0c;邮箱&#xff0c;密码&#xff0c;账号&#xff0c;会有邮箱验证&#xff0c;跟着步骤来就好了 配置 本机上设置你的github的邮箱和用户名 …

R语言学习,入门

我是一名6年开发经验的程序员&#xff0c;后端&#xff0c;大数据&#xff0c;前端都会。 现在加入了医疗行业&#xff0c;要做数据分析&#xff0c;前同事的实验室生信专业的&#xff0c;用的是R语言&#xff0c;为了跑通他的程序。就来学一下吧&#xff0c;看了一下好像挺简…

农村生活污水处理监测系统解决方案

一、概述 随着国民经济的发展和农村生活水平的提高&#xff0c;农村生活用水量越来越大&#xff0c;随之而来的污水产量也越来越大&#xff0c;农村生活污染对环境的压力越来越明显。环境保护意识的逐渐增强&#xff0c;使得人们对青山绿水的希望更为迫切&#xff0c;为满足人民…

Nordic 52832作为HID 键盘连接配对电视/投影后控制没反应问题的分析和解决

问题现象&#xff1a;我们的一款HID键盘硬件一直都工作的很好&#xff0c;连接配对后使用起来和原装键盘效果差不多&#xff0c;但是后面陆续有用户反馈家里的电视等蓝牙设备配对连接我们的键盘后&#xff0c;虽然显示已连接&#xff0c;但实际上控制不了。设备涉及到了好些品牌…

【操作与配置】VSCode配置Python及Jupyter

Python环境配置 可以参见&#xff1a;【操作与配置】Python&#xff1a;CondaPycharm_pycharmconda-CSDN博客 官网下载Python&#xff1a;http://www.python.org/download/官网下载Conda&#xff1a;Miniconda — Anaconda documentation VSCode插件安装 插件安装后需重启V…

layui-表格

1.使用方法 加上table标签 加上classlayui-table colgroup是列属性 tr是行td是列 thead是表头&#xff0c;后面一一对应 2.基础属性 加lay-even逐行换色 加lay-skin 设置边框风格

竞赛 深度学习+opencv+python实现昆虫识别 -图像识别 昆虫识别

文章目录 0 前言1 课题背景2 具体实现3 数据收集和处理3 卷积神经网络2.1卷积层2.2 池化层2.3 激活函数&#xff1a;2.4 全连接层2.5 使用tensorflow中keras模块实现卷积神经网络 4 MobileNetV2网络5 损失函数softmax 交叉熵5.1 softmax函数5.2 交叉熵损失函数 6 优化器SGD7 学…

企业多存储方式如何兼顾安全统一管理、便捷流畅访问的双向需求?

数据和文件存储是企业最基础的需求&#xff0c;常见的存储方式有磁盘存储、NAS存储、SAN存储、云存储、分布式存储、闪存存储等&#xff1b;随着企业规模的扩大、业务结构的复杂化&#xff0c;企业内部可能会同时出现多种存储方式、多个存储设备并行使用的情况。 这样的使用场景…

Ubuntu24.04(22.04+版本通用)Miniconda与Isaacgym

1. ubuntu24.04安装minicondda mkdir -p ~/miniconda3 wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh -O ~/miniconda3/miniconda.sh解释下这段代码 bash ~/miniconda3/miniconda.sh -b -u -p ~/miniconda3~/miniconda3/miniconda.sh: 指向Mi…