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

初探 MindSpore(四):把最小训练单元放进数据迭代

初探 MindSpore四把最小训练单元放进数据迭代第三篇已经把 MindSpore 的最小训练闭环搭出来了NetWithLossCellOptimizerTrainOneStepCell但这还只是“一步训练”。真正进入训练过程还需要回答两个问题数据从哪里来。一步训练如何重复执行。这一篇只处理这两件事不展开完整工程模板不引入复杂数据集也不讨论回调、Checkpoint 和评估体系。目标只有一个把最小训练单元放进最简单的数据迭代里看清 MindSpore 训练过程的基本连接方式。训练过程再往前只多出一层数据MindSpore 官方教程把模型训练概括为四步构建数据集定义网络定义超参数、损失函数和优化器输入数据进行训练与评估前面三篇已经把第 2 步和第 3 步压缩成了最小形式。第四篇补上的就是第 1 步和第 4 步里最核心的部分把数据喂给一步训练单元。最小训练闭环先保留不动先沿用第三篇里的最小训练单元importnumpyasnpimportmindsporeasmsimportmindspore.nnasnnclassNet(nn.Cell):def__init__(self):super().__init__()self.fcnn.Dense(10,2)defconstruct(self,x):returnself.fc(x)netNet()loss_fnnn.MSELoss()net_with_lossnn.WithLossCell(net,loss_fn)optimizernn.Adam(net.trainable_params(),learning_rate1e-3)train_stepnn.TrainOneStepCell(net_with_loss,optimizer)这部分不再解释。它的作用只是提供一个已经能执行单步训练的对象train_step。接下来要做的不是改训练骨架而是把数据按批次送进去。数据集最小入口GeneratorDataset如果只是为了说明训练过程如何接起来最轻量的入口不是直接加载真实数据集而是先使用GeneratorDataset。MindSpore 官方GeneratorDataset文档对它的定义很直接它是一个源数据集可以通过 Python 数据源在每个 epoch 生成数据。生成数据的列名和列类型由用户定义的数据决定。对这一篇来说GeneratorDataset的价值在于两点足够轻不需要额外准备真实数据文件已经属于 MindSpore 正式的数据集接口而不是临时 Python 列表一个最小例子如下importnumpyasnpimportmindspore.datasetasdsdefdata_generator():for_inrange(8):xnp.random.randn(10).astype(np.float32)ynp.random.randn(2).astype(np.float32)yieldx,y datasetds.GeneratorDataset(data_generator,column_names[data,label])datasetdataset.batch(4)这里的结构很简单原始生成器每次产出一条样本GeneratorDataset把它包装成 MindSpore 数据集batch(4)把单条样本合成 batch到这一步训练过程需要的数据入口就有了。先用最直接的方式跑一个训练循环如果只从理解训练过程的角度出发最直接的方式不是先引入Model.train而是先手动遍历数据集把 batch 逐个送进TrainOneStepCell。这样做的好处是结构最透明。foritemindataset.create_dict_iterator():losstrain_step(item[data],item[label])print(loss)这段代码只做了一件事从数据集中取出一个 batch把data和label送进train_step返回当前这一步的 loss对 PyTorch 用户来说这一层理解非常重要。因为这里清楚地展示了 MindSpore 最小训练过程的真实边界数据迭代在外层一步训练封装在TrainOneStepCell里。也就是说第四篇真正要让读者看清的不是某个具体 API而是“数据”和“一步训练”是怎样接起来的。把前面的部分拼成一个完整最小例子把网络、训练单元和数据集拼在一起就是一个最小可读的训练示例importnumpyasnpimportmindsporeasmsimportmindspore.nnasnnimportmindspore.datasetasdsclassNet(nn.Cell):def__init__(self):super().__init__()self.fcnn.Dense(10,2)defconstruct(self,x):returnself.fc(x)defdata_generator():for_inrange(8):xnp.random.randn(10).astype(np.float32)ynp.random.randn(2).astype(np.float32)yieldx,y datasetds.GeneratorDataset(data_generator,column_names[data,label])datasetdataset.batch(4)netNet()loss_fnnn.MSELoss()net_with_lossnn.WithLossCell(net,loss_fn)optimizernn.Adam(net.trainable_params(),learning_rate1e-3)train_stepnn.TrainOneStepCell(net_with_loss,optimizer)foritemindataset.create_dict_iterator():losstrain_step(item[data],item[label])print(loss)这段代码里最关键的不是随机数据本身而是训练结构终于完整了数据集负责提供 batchTrainOneStepCell负责执行一步训练外层循环负责重复调用训练步骤这就是最小训练过程。为什么先讲手动迭代而不是先讲Model.trainMindSpore 官方教程当然提供了更高层的训练入口。官方Model training教程本身就展示了Model、数据集、训练和评估这些更完整的接口组织方式。官方mindspore.train.Model文档也明确给出了train、eval、predict等高层入口。但第四篇不先从Model.train开始有一个非常实际的原因对于 PyTorch 用户先看懂训练是如何一步步拼起来的比先记住高层接口更重要。如果一开始就直接上Model.train(...)初学者当然能看到一个更短的训练入口但也更容易忽略真正的结构关系loss 是怎么接进网络的优化器是怎么接进训练单元的数据集最终是怎么送到训练步骤里的而手动迭代数据集再调用train_step恰好把这些关系全部露出来了。GeneratorDataset在这里的意义不是“真实”而是“最小”这一篇用GeneratorDataset不是因为它代表典型业务数据而是因为它足够小适合把训练连接过程讲清楚。官方教程中当然还有更完整的数据集写法包括使用已有标准数据集、做数据处理、做 shuffle 和 batch 等。但这一篇不需要这些内容。当前目标不是写一个完整训练项目而是验证一件事MindSpore 的训练过程至少需要两层显式结构数据集迭代以及一步训练封装。只要这一点看清后面再换成 MNIST、CIFAR-10 或其他真实数据集训练主干其实不会变。到这里最小训练过程已经完整了如果把前三篇和这一篇连起来看结构已经非常清楚第一篇解决框架基本结构nn.Module - nn.Cellforward - construct第二篇解决最小网络改写从一个最小 PyTorch 网络改写到 MindSpore第三篇解决一步训练封装Net - WithLossCell - Optimizer - TrainOneStepCell第四篇解决数据如何接进训练Dataset - batch - iterator - train_step也就是说到这一章为止已经能把一个最小网络真正跑起来了。虽然它还不是一个“完整项目”但训练主干已经具备。本文结论第四篇只建立一个结论在 MindSpore 里完整的最小训练过程不是单独写一个网络然后直接开训而是把数据集迭代和TrainOneStepCell显式接起来。如果压缩成三条就是数据先组织成Dataset数据按 batch 迭代每个 batch 交给TrainOneStepCell这也是 PyTorch 用户在进入 MindSpore 训练部分后接下来最应该建立的直觉。下一篇最自然的主题不是继续扩展更多数据接口而是引入更高一层的训练入口Model。到那时再回头看就会更容易理解Model.train()到底帮用户封装了什么。

相关文章:

初探 MindSpore(四):把最小训练单元放进数据迭代

初探 MindSpore(四):把最小训练单元放进数据迭代 第三篇已经把 MindSpore 的最小训练闭环搭出来了: NetWithLossCellOptimizerTrainOneStepCell 但这还只是“一步训练”。真正进入训练过程,还需要回答两个问题&#xf…...

Phi-3-Mini-128K多轮对话效果深度评测:上下文保持与逻辑一致性

Phi-3-Mini-128K多轮对话效果深度评测:上下文保持与逻辑一致性 最近在体验各种开源大模型时,我一直在想一个问题:一个模型在单轮问答里表现优秀,是不是就意味着它真的“聪明”?答案可能没那么简单。真正的智能对话&am…...

Spring Cloud Java后端面试题精选 - Day 9

Spring Cloud Java后端面试题精选 - Day 9 📚 前言 Spring Cloud作为微服务架构全家桶,在现代Java后端开发中扮演着至关重要的角色。掌握Spring Cloud的相关知识是Java后端工程师面试中的常见考点,也是实际项目开发中的必备技能。 &#x1f5…...

GPT-SoVITS实战:仅需5秒音频,手把手教你克隆专属语音助手

GPT-SoVITS实战:仅需5秒音频,手把手教你克隆专属语音助手 1. 引言:声音克隆技术的新突破 你是否想过拥有一个能完美模仿自己声音的AI助手?或者为你的视频创作打造独特的角色配音?GPT-SoVITS让这一切变得触手可及。这…...

初探 MindSpore(三):把最小网络接上训练

初探 MindSpore(三):把最小网络接上训练 前两篇只处理了网络定义本身: nn.Module -> nn.Cellforward() -> construct() 但只会写前向网络还不够。对 PyTorch 用户来说,下一步真正需要搞清楚的是:Mind…...

快速上手Qwen2.5-7B微调:单卡10分钟,打造专属对话机器人

快速上手Qwen2.5-7B微调:单卡10分钟,打造专属对话机器人 1. 为什么你需要尝试Qwen2.5-7B微调 1.1 大模型微调的价值 想象一下,你有一个非常聪明的助手,但它总是以标准化的方式回答所有问题。现在,你想让它记住你的个…...

STM32版FX2N源码与原理图解析:C语言编译的PLC通信程序移植与应用指南

STM32版FX2N源码&原理图&PCB板(可直接移植) FX2N源码V3.8版的使用基本说明: 编译语言:C语言 FX2N源码V3.8版是根据三菱FX2N的PLC通信协议、通信命令以及基于STM32F103系列单片机上编写运行的程序,可以直接利用三菱编程软件编写梯形图…...

简历制作效率革命:Reactive-Resume全场景应用指南

简历制作效率革命:Reactive-Resume全场景应用指南 【免费下载链接】Reactive-Resume AmruthPillai/Reactive-Resume: 是一个基于 React 和 Firebase 的简历生成工具。适合对 Web 开发和简历制作有兴趣的人,特别是想快速生成个性化简历的人。特点是提供了…...

Windows系统高效预览WebP图片的插件解决方案

1. 为什么Windows系统需要WebP预览插件? 如果你经常从网上下载图片素材,或者和设计师同事打交道,最近两年肯定会发现一种后缀名为.webp的图片越来越多。这种由Google推出的图像格式,用手机拍张照片存成WebP格式,文件大…...

MedGemma 1.5新手入门:三分钟搞定本地医疗AI问答系统

MedGemma 1.5新手入门:三分钟搞定本地医疗AI问答系统 1. 为什么选择本地医疗AI助手 在医疗健康领域,隐私保护和专业可靠性是两个最核心的需求。传统在线医疗AI存在三个明显痛点:健康数据需要上传云端、回答过程像黑盒子无法验证、网络依赖性…...

电力系统新手必看:5分钟搞定IEEE5节点Simulink潮流仿真(附MATLAB代码)

电力系统仿真实战:5分钟掌握IEEE5节点Simulink潮流计算核心技巧 从零开始的电力系统仿真之旅 第一次打开Simulink面对空白的建模画布时,那种无从下手的感觉我至今记忆犹新。作为电力系统分析的基础,潮流计算就像电力工程师的"ABC"&…...

Keil5 MDK在Cortex M系列关于分散加载文件说明指导

类别内容摘要本文结合 SRAM 示例工程,说明如何在Cortex M( LCM32F067 )工程中使用 Keil 分散加载文件,将部分函数固定到指定 Flash 地址运行,并将部分函数搬运到指定 RAM 地址运行。源代码路径链接: https://pan.baidu…...

ESP32音频开发指南:如何用ESP-ADF的I2S Stream实现高质量音频输出

ESP32音频开发实战:基于I2S Stream的高保真音频输出全解析 在物联网和智能硬件快速发展的今天,音频处理能力已成为嵌入式设备的重要功能之一。ESP32作为一款高性价比的Wi-Fi/蓝牙双模芯片,凭借其强大的处理能力和丰富的外设接口,在…...

火山方舟 Coding Plan 服务变更公告

亲爱的火山方舟 Coding Plan 用户朋友们:大家好!首先由衷感谢大家对火山方舟 Coding Plan 的喜爱与支持!自产品上线以来,我们收到了远超预期的用户热情,无数订阅者通过 Coding Plan 享受到了高效、便捷的 AI 提效服务&…...

python+Ai技术框架的基于与.的个人健康档案管理系统django flask

目录技术选型与框架对比系统模块设计实现步骤部署与扩展关键注意事项项目技术支持可定制开发之功能创新亮点源码获取详细视频演示 :文章底部获取博主联系方式!同行可合作技术选型与框架对比 Django:适合快速构建全功能应用,自带O…...

PostgreSQL时间戳插入踩坑实录:为什么to_date函数会丢失时分秒?

PostgreSQL时间戳处理深度解析:从to_date陷阱到跨数据库兼容实践 在数据库开发中,时间戳处理看似简单却暗藏玄机。许多从Oracle转向PostgreSQL的开发者都会惊讶地发现,原本在Oracle中运行良好的日期处理代码,到了PostgreSQL环境下…...

三菱FX5U与欧姆龙E5CC温控器的通讯实现

三菱FX5U与3台欧姆龙E5CC温控器通讯程序(SL5U-1) 功能:通过三菱FX5U本体485口,结合触摸屏网口,实现对3台欧姆龙E5CC温控器设定温度,读取温度。 反应灵敏,通讯稳定可靠。 器件:三菱FX5UPLC,3台欧…...

手把手教你用AppleScript和Launchd定时重启Mac TouchBar(含日志记录)

深度解析:如何通过自动化脚本优化Mac TouchBar的稳定性 TouchBar作为MacBook Pro的标志性功能,虽然提升了交互体验,但长期使用后容易出现闪烁、卡顿等问题。本文将系统性地介绍如何利用AppleScript和Launchd构建一套完整的TouchBar维护方案&a…...

积木报表达梦数据库适配:零代码可视化工具无缝集成方案

积木报表达梦数据库适配:零代码可视化工具无缝集成方案 【免费下载链接】jimureport 「数据可视化工具:报表、大屏、仪表盘」积木报表是一款类Excel操作风格,在线拖拽设计的报表工具和和数据可视化产品。功能涵盖: 报表设计、大屏设计、打印设…...

二叉树展开链表

https://leetcode.cn/problems/flatten-binary-tree-to-linked-list/description/?envTypestudy-plan-v2&envIdtop-100-liked 题目 思路 先序遍历:跟 -> 左 -> 右 。最后我们要拼接成的序列为 1 -> 2 -> 3 -> 4 -> 5 -> 6 如果正着做&…...

Docker版OnlyOffice中文字体配置全攻略:从字号调整到字体添加

Docker版OnlyOffice中文字体配置全攻略:从字号调整到字体添加 在企业文档协作和教育课件制作中,中文排版规范直接影响内容的专业性和可读性。对于使用Docker部署OnlyOffice的用户来说,默认配置往往无法满足中文排版需求。本文将深入探讨如何通…...

3D 点云处理(PCL)

PCL(点云库)是我们从2D视觉迈向3D空间理解的“三维感知核心”。在掌握OpenCV的基础上,PCL将帮助把内窥镜的2D图像信息,扩展到完整的三维手术空间理解——这正是精准手术导航的基础。 基于之前已经接触过的PCL内容,提供…...

为什么说学编程不如直接去学网络安全?

一、先看一组扎心对比:市场真的不一样 程序员 :2024 智联招聘数据显示,Java 开发岗平均 1 岗 38 人竞争,应届生起薪中位数仅 7800 元;某大厂 2024 校招开发岗简历通过率不足 5%,且明确要求 “211/985 或顶…...

掌握ConfuserEx:从入门到精通的.NET程序混淆保护实战指南

掌握ConfuserEx:从入门到精通的.NET程序混淆保护实战指南 【免费下载链接】ConfuserEx An open-source, free protector for .NET applications 项目地址: https://gitcode.com/gh_mirrors/co/ConfuserEx ConfuserEx是一款开源免费的.NET程序保护工具&#x…...

手把手教你设计反激式开关电源:从PWM控制到高频变压器选型(附完整电路图)

手把手教你设计反激式开关电源:从PWM控制到高频变压器选型(附完整电路图) 在电子设备小型化与高效化的趋势下,反激式开关电源凭借其结构简单、成本低廉的优势,成为100W以内功率场景的首选方案。无论是家用电器辅助电源…...

Keil MDK-ARM避坑指南:STM32开发环境搭建中的5个常见错误及解决方法

Keil MDK-ARM避坑指南:STM32开发环境搭建中的5个常见错误及解决方法 当你第一次打开Keil MDK-ARM准备开始STM32开发之旅时,可能会被各种报错信息、许可证问题和Pack包加载失败搞得一头雾水。作为一款在嵌入式开发领域广泛使用的IDE,Keil MDK-…...

Qt5离线安装包下载终极指南:绕过IP限制的3种实用方法(含迅雷链接)

Qt5离线安装包高效获取方案:开发者必备的三种技术路径 对于国内开发者而言,获取Qt5离线安装包常常会遇到"Download from your IP address is not allowed"的提示。这并非技术障碍,而是网络环境导致的资源访问限制。本文将系统性地介…...

乡合农服土壤改良:给土地“治病”,让丰收“生根”

在什邡市洛水镇银池村的蒜田里,种植大户黎昌勇抓起一把泥土,眼角笑意满满:“这地真的‘活’过来了!”三年前,这片田土壤酸化严重,种下的大蒜不是瘦小枯黄,就是中途坏死,收成远不及以…...

避开这5个坑!Grafana饼图面板使用中的常见错误及解决方案

避开这5个坑!Grafana饼图面板使用中的常见错误及解决方案 在数据可视化领域,Grafana的Piechart panel(饼图面板)因其直观的表现形式而广受欢迎。然而,许多用户在从入门到精通的路上,常常会遇到一些看似简单…...

Python 中的并发 —— 多进程

摘要:本文介绍了Python中的多进程编程方法,重点对比了多进程与多线程的差异。多进程通过利用多个CPU核心实现真正并行,能有效规避Python的GIL限制。文章详细讲解了三种启动进程的方式(Fork/Spawn/Forkserver)&#xff…...