深度学习-----《PyTorch神经网络高效训练与测试:优化器对比、激活函数优化及实战技巧》

一、训练过程

  1. 并行批量训练机制

    • 一次性输入64个批次数据,创建64个独立神经网络并行训练。
    • 所有网络共享参数(Ω),更新时计算64个批次的平均损失,统一更新全局参数。
  2. 梯度更新策略

    • 使用torch.no_grad()上下文管理器清理反向传播产生的临时数据,优化内存利用。
  3. 多轮训练重要性

    • 单轮训练(6万张图片)仅能获得19.22%正确率,需通过循环训练集(如10轮)提升模型收敛性。
    • model.train()模式确保参数持续更新,避免重复初始化。

二、测试过程

  1. 测试集评估逻辑

    • 输入测试数据后,前向传播得到预测结果,通过argmax提取最大概率对应的类别。
    • 统计预测正确的数量,计算正确率(Correct / Total Test Samples)。
  2. 损失值与正确率的关系

    • 测试阶段仍会计算损失值,但非核心指标;正确率(如70.04%)为模型性能的关键衡量标准。
  3. 资源管理优化

    • 使用with torch.no_grad()减少冗余计算,提升测试效率。

三、关键实现细节

  1. 数据预处理

    • 测试数据需明确设备(GPU/CPU),通过to(device)确保设备一致性。
  2. 预测结果处理

    • 将预测概率转换为类别标签,对比真实标签统计正确率。
  3. 训练效率优化

    • 设置打印间隔(如每100批次输出一次损失值),平衡调试需求与训练速度。

四、实践要点

  • 超参数调整:通过增加训练轮数(如从10轮扩展至50轮)可显著提升模型性能。
  • 验证集作用:测试集主要用于评估最终模型效果,而非实时调参。
  • 竞赛策略:合理分配训练时间,确保比赛前完成高效模型迭代。

五、关键代码片段

1. 批量梯度下降训练核心代码

# 初始化模型参数 Ω
model = MyNeuralNetwork().to(device)  # device为'cuda'或'cpu'
optimizer = torch.optim.SGD(model.parameters(), lr=0.01)
criterion = torch.nn.CrossEntropyLoss()  # 分类任务损失函数# 训练循环
for epoch in range(num_epochs):for batch_idx, (inputs, labels) in enumerate(train_loader):# 前向传播outputs = model(inputs)loss = criterion(outputs, labels)# 反向传播 + 参数更新optimizer.zero_grad()  # 清空梯度缓存loss.backward()        # 反向传播计算梯度optimizer.step()       # 更新参数 Ω# 每100批次打印一次损失值if batch_idx % 100 == 0:print(f"Epoch {epoch}, Batch {batch_idx}: Loss = {loss.item()}")

2. 多轮训练扩展

# 外层循环控制训练轮数
for epoch in range(num_epochs):# 内层循环执行单轮训练(6万张图片)for inputs, labels in train_loader:# ...(同上训练逻辑)...# 每轮结束后测试模型test_accuracy = evaluate_model(model, test_loader)print(f"Epoch {epoch+1} Test Accuracy: {test_accuracy}")

3. 测试集评估代码

def evaluate_model(model, test_loader):correct = 0total = 0with torch.no_grad():  # 禁用梯度计算以节省内存for inputs, labels in test_loader:inputs = inputs.to(device)  # 确保数据在正确设备上labels = labels.to(device)outputs = model(inputs)     # 前向传播_, predicted = torch.max(outputs.data, 1)  # argmax获取预测类别total += labels.size(0)      # 统计总样本数correct += (predicted == labels).sum().item()  # 统计正确数return correct / total  # 返回准确率

4. 关键优化点说明

  • 设备兼容性:通过inputs.to(device)统一数据与模型的设备(CPU/GPU)
  • 资源管理with torch.no_grad()减少测试阶段的内存占用
  • 批量处理:64个批次并行训练加速收敛(需调整DataLoaderbatch_size

六、核心问题

  • 训练效率低:原模型使用随机梯度下降(SGD)优化器,需100轮训练才能达到98%正确率,耗时约10分钟;改用Adam优化器后,仅需10轮训练即可达到96.81%正确率。
  • 梯度消失问题:Sigmoid激活函数的导数范围(0~0.25)导致多层网络参数更新停滞,损失值在局部震荡无法收敛45。


七、关键知识点

1. 优化器改进:从SGD到Adam

  • 原理
    • SGD每次用全部数据更新参数,易陷入局部最优且收敛慢;
    • Adam通过自适应学习率和动量机制加速收敛,避免SGD的“高方差”问题。

代码示例

# 原SGD优化器(需修改)
optimizer = torch.optim.SGD(model.parameters(), lr=0.01)# 改为Adam优化器
optimizer = torch.optim.Adam(model.parameters(), lr=0.01)

2. 学习率影响

  • 现象:固定学习率(如0.01)导致训练后期损失值震荡,无法逼近全局最优;
  • 解决思路:动态调整学习率(如学习率衰减),但需后续章节展开。

3. 激活函数优化:Sigmoid → ReLU

  • 梯度消失原因
    • Sigmoid导数范围(0~0.25)导致多层网络参数更新时梯度逐层衰减至0;
    • 数学表达:
  • ReLU优势
    • 计算简单,加速训练

代码示例

# 原Sigmoid激活函数(需修改)
def sigmoid(x):return 1 / (1 + np.exp(-x))# 改为ReLU激活函数
def relu(x):return np.maximum(0, x)

八、实验结果对比


九、扩展思考

  • 深层网络适配性:ReLU在超过3层的网络中表现优异,是现代深度学习的基础激活函数
  • 优化器组合:AdamW(带权重衰减的Adam)可缓解过拟合,适合迁移学习场景

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

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

相关文章

Matplotlib 可视化大师系列(五):plt.pie() - 展示组成部分的饼图

目录Matplotlib 可视化大师系列博客总览Matplotlib 可视化大师系列(五):plt.pie() - 展示组成部分的饼图一、 饼图是什么?何时使用(何时避免)?二、 函数原型与核心参数三、 从入门到精通&#x…

C++ Core Guidelines 核心理念

引言 C 是一门功能强大但复杂性极高的编程语言。为了帮助开发者更高效、安全地使用现代 C,C 核心指南(CppCoreGuidelines)应运而生。这份由 C 之父 Bjarne Stroustrup 等人主导的指南,提供了大量关于 C 编码的规则、最佳实践和设…

vue3 - 组件间的传值

组件间传参 父传子v-on/props 父组件使用v-on:绑定要传的参数:parentData"parentData"&#xff1a; <template><div><Child1 :parentData"parentData"></Child1></div> </template> <script setup lang"ts…

Kafka 在 6 大典型用例的落地实践架构、参数与避坑清单

一、选型速查表场景关键目标推荐清单&#xff08;示例&#xff09;消息&#xff08;Messaging&#xff09;解耦、低延迟、可靠投递acksall、enable.idempotencetrue、retries>0、min.insync.replicas2、合理分区键、DLT网站活动追踪吞吐极高、可回放主题按类型拆分&#xff…

Node.js(1)—— Node.js介绍与入门

前面我们谈到一些前端开发的内容&#xff0c;学习了HTML、css和JavaScript&#xff0c;已经掌握了如何编写一些简单功能的网页。但是只属于前端部分&#xff0c;我们只能在本地打开文件进行浏览&#xff0c;不能让其他人打开我们编写的网站&#xff1b;这时就需要后端部分上场了…

Python办公——爬虫百度翻译网页版(自制翻译小工具——进阶更新版)

目录 专栏导读 前言 项目概述 功能特点 技术栈 核心架构设计 类结构设计 界面布局设计 核心功能实现 1. 智能语言检测 2. 异步翻译处理 3. HTTP请求处理 4. 结果解析与显示 界面设计亮点 1. 响应式布局 2. 用户体验优化 3. 现代化组件 技术难点与解决方案 1. 跨线程UI更新 2. U…

CentOS7 + Docker 部署 Dify 超详细图文教程

如今Agent在互联网上大行其道&#xff0c;网上吵得火热&#xff0c;各个企业也都想搭建自己的Agent。COZE的开源还有最近新出的JoyAgent也都让大家跃跃欲试&#xff0c;今天为大家带来的是Dify的部署方式&#xff0c;相比其他工作流平台&#xff0c;Dify对于整个Agent制作的流程…

vscode(MSVC)进行c++开发的时,在debug时查看一个eigen数组内部的数值

vscode进行c开发的时&#xff0c;在debug时查看一个eigen数组内部的数值问题描述解决方案拓展其他可视化使用visual studio时的可视化使用别的编译器的可视化问题描述 使用vscode进行c开发&#xff0c;编译器是MSVC&#xff0c;在debug的时候想查看一个eigen数组的数值&#x…

【51单片机】【protues仿真】基于51单片机八路抢答器数码管系统

目录 一、主要功能 二、使用步骤 三、硬件资源 四、软件设计 五、实验现象 一、主要功能 1、数码管显示 2、主持人按下开始&#xff0c;8位选手开始抢答 3、第一次使用要设置抢答时间&#xff0c;支持掉电存储 4、选手抢答成功&#xff0c;数码管会显示其号码 5、按下主…

深度学习:CUDA、PyTorch下载安装

目录 一、安装准备 二、安装CUDA 2.1 查看本机支持的 CUDA 版本及相关信息 2.2 卸载CUDA(可选) 2.3 下载cuda安装包 2.4 安装 2.5 配置环境变量 三、安装PyTorch 3.1 版本选择 3.2 下载安装 方法一&#xff1a;直接安装&#xff08;不建议&#xff0c;网差的话会死机…

MyBatis-Plus 快速入门 -常用注解

目录 1. 常用注解 TableName TableId TableField 2. IdType 枚举 3. 使用 TableField 的常见场景 4. 完整示例 5. 总结 在使用 MyBatis-Plus 的过程中&#xff0c;我们经常会用到一些注解来完成实体类与数据库表字段之间的映射关系。本文将带你快速入门&#xff0c;了解…

2025-08-23Excel 条件高亮工具,秒高亮显示符合筛选条件的行数据

Excel 条件高亮工具&#xff0c;秒高亮显示符合筛选条件的行数据 先看图【加班终结者】Excel 条件高亮工具&#xff08;试用版&#xff09; ——让错误数据一秒现形&#xff0c;免费先爽 30 次&#xff01; 你是不是也这样&#xff1f; • 财务对账&#xff0c;1000 行工资表里…

vue 一键打包上传

npm run build之后&#xff0c;将dist文件夹自动压缩&#xff0c;通过ssh自动连接服务器&#xff0c;把压缩包放到指定目录下&#xff0c;然后自动解压根目录创建gulpfile.js文件const gulp require(gulp); const GulpSSH require(gulp-ssh); const archiver require(archiv…

【Qt调试】无法查看QString内容

环境Qt版本&#xff1a;6.9.1问题Qt creator进入断点&#xff0c;Expressions不能查看变量&#xff08;类型&#xff1a;QString&#xff09;的内容。解决方法选择变量右键&#xff0c;勾选【Use Debugging Helpers】

防爆自动气象监测设备:高危环境的 “安全堡垒”

防爆自动气象监测设备&#xff1a;高危环境的 “安全堡垒” 柏峰【BF-FB】在化工园区、油气田、矿山等高危行业领域&#xff0c;丝毫马虎不得。而气象条件&#xff0c;这个看似平常的因素&#xff0c;实则在安全生产中扮演着举足轻重的角色。防爆自动气象监测设备的出现&#x…

《C++进阶:引用补充、内联函数与nullptr 核心用法》

&#x1f618;个人主页&#xff1a;Cx330❀ &#x1f440;个人简介&#xff1a;一个正在努力奋斗逆天改命的二本觉悟生 &#x1f4d6;个人专栏&#xff1a;《C语言》《LeetCode刷题集》《数据结构-初阶》《C知识分享》 &#x1f31f;人生格言&#xff1a;心向往之行必能至 前言…

通过python程序将实时监测数据写入excel软件进行保存是常用和非常实用的功能,本文教会大家怎么去搞定此功能

目录 一、功能介绍 二、具体的程序示例 三、实际应用建议 一、功能介绍 本方案的核心功能是持续监听一个数据源&#xff08;如传感器、API接口、消息队列、其他应用程序等&#xff09;&#xff0c;将获取到的实时数据流以追加的方式写入到Excel文件中。同时&#xff0c;方案…

在 Linux 中全局搜索 Word 文档内容的完整指南

文章目录 为什么不能直接使用 grep 搜索 Word 文档? 解决方案:使用 Pandoc 转换后搜索 步骤 1:安装 Pandoc 步骤 2:创建搜索脚本 步骤 3:执行搜索(两者选其一) 一行命令解决方案 高级用法与优化 1. 忽略大小写搜索 2. 显示匹配内容 3. 性能优化 注意事项 结论 在日常工作中…

基于STM32单片机智能农业大棚控制系统-插件款 DIY 设计开源(实物+程序+原理图+其他资料)

目录 一、项目成品展示 二、功能介绍 三、硬件组成 四、PCB展示 五、程序设计 六、资料分享 资料获取 查看主页介绍&#xff1a;兆龙电子单片机设计 一、项目成品展示 项目成品图片展示&#xff1a; 哔哩哔哩视频链接&#xff1a; STM32单片机智能农业大棚控制系统-插件…