news 2026/10/31 2:56:59

加载权重文件后发现准确率有问题

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
加载权重文件后发现准确率有问题

保存权重文件时,最好使用copy.deepcopy,不然可能出现引用的问题,导致本应该保存best pth的变成保存最后一个epoch的pth。

/root/unified_nas/training/trainer.py

# 更新最佳模型 if val_metrics['accuracy'] > best_accuracy: best_accuracy = val_metrics['accuracy'] best_val_metrics = val_metrics best_model_state = { # 'model': self.model.state_dict(), # 'head': self.task_head.state_dict() 'model': copy.deepcopy(self.model.state_dict()), # ✅ 深拷贝 'head': copy.deepcopy(self.task_head.state_dict()) # ✅ 深拷贝 } # 保存最佳模型权重到文件 torch.save(best_model_state, save_path) # print(f"✅ Best model saved with accuracy: {best_accuracy:.2f}%") self._output(f"✅ Best model saved with accuracy: {best_accuracy:.2f}%")

这部分的完整代码如下:

import torch import torch.nn as nn from torch.optim import Adam from tqdm import tqdm import numpy as np from collections import defaultdict import copy # 设置随机数种子 SEED = 42 # 你可以选择任何整数作为种子 torch.manual_seed(SEED) torch.cuda.manual_seed(SEED) class SingleTaskTrainer: """ 针对单个数据集的训练器 """ def __init__(self, model, dataloaders, device='cuda', logger=None): """ 初始化训练器 参数: model: 要训练的模型 dataloaders: 数据加载器字典,包含 'train' 和 'test' 两个键 device: 训练设备 ('cuda' 或 'cpu') """ self.model = model.to(device) self.dataloaders = dataloaders self.device = device self.logger = logger # 如果没有提供logger,创建一个简单的logger来模拟print行为 # 确保模型有 output_dim 属性 if not hasattr(model, 'output_dim'): raise AttributeError("Model must have 'output_dim' attribute") # 获取类别数 self.num_classes = len(dataloaders['train'].dataset.classes) print(f"Number of classes: {self.num_classes}") # 创建任务头 self.task_head = nn.Linear(model.output_dim, self.num_classes).to(device) # 定义损失函数和优化器 self.criterion = nn.CrossEntropyLoss() self.optimizer = Adam( list(model.parameters()) + list(self.task_head.parameters()), lr=1e-3 ) def _output(self, message): """统一的输出方法:如果有logger则使用logger,否则使用print""" if self.logger: self.logger.info(message) else: print(message) def train_epoch(self): """ 单个训练周期 """ self.model.train() self.task_head.train() running_loss = 0.0 correct = 0 total = 0 for inputs, labels in tqdm(self.dataloaders['train'], desc="Training"): inputs = inputs.to(self.device) labels = labels.to(self.device) self.optimizer.zero_grad() features = self.model(inputs) outputs = self.task_head(features) loss = self.criterion(outputs, labels) loss.backward() self.optimizer.step() running_loss += loss.item() _, predicted = outputs.max(1) total += labels.size(0) correct += predicted.eq(labels).sum().item() metrics = { 'loss': running_loss / len(self.dataloaders['train']), 'accuracy': 100. * correct / total } return metrics def evaluate(self): """ 模型评估 """ self.model.eval() self.task_head.eval() running_loss = 0.0 correct = 0 total = 0 with torch.no_grad(): for inputs, labels in tqdm(self.dataloaders['test'], desc="Evaluating"): inputs = inputs.to(self.device) labels = labels.to(self.device) features = self.model(inputs) outputs = self.task_head(features) loss = self.criterion(outputs, labels) running_loss += loss.item() _, predicted = outputs.max(1) total += labels.size(0) correct += predicted.eq(labels).sum().item() metrics = { 'loss': running_loss / len(self.dataloaders['test']), 'accuracy': 100. * correct / total } return metrics def train(self, epochs=10, save_path='best_model.pth'): """ 训练模型并保存最佳权重 参数: epochs: 训练周期数 save_path: 最佳模型权重保存路径 返回: best_accuracy: 最佳验证准确率 best_val_metrics: 最佳验证指标 history: 训练历史记录 best_model_state: 最佳模型状态字典 """ best_accuracy = 0.0 best_val_metrics = None # 保存最佳验证指标 history = [] best_model_state = None # 保存最佳模型状态 for epoch in range(epochs): # print(f"\nEpoch {epoch + 1}/{epochs}") self._output(f"\nEpoch {epoch + 1}/{epochs}") # 训练阶段 train_metrics = self.train_epoch() # 验证阶段 val_metrics = self.evaluate() # 保存历史 history.append({ 'train': train_metrics, 'val': val_metrics }) # print(f"\nValidation Accuracy: {val_metrics['accuracy']:.2f}%") self._output(f"\nValidation Accuracy: {val_metrics['accuracy']:.2f}%") # 更新最佳模型 if val_metrics['accuracy'] > best_accuracy: best_accuracy = val_metrics['accuracy'] best_val_metrics = val_metrics best_model_state = { # 'model': self.model.state_dict(), # 'head': self.task_head.state_dict() 'model': copy.deepcopy(self.model.state_dict()), # ✅ 深拷贝 'head': copy.deepcopy(self.task_head.state_dict()) # ✅ 深拷贝 } # 保存最佳模型权重到文件 torch.save(best_model_state, save_path) # print(f"✅ Best model saved with accuracy: {best_accuracy:.2f}%") self._output(f"✅ Best model saved with accuracy: {best_accuracy:.2f}%") return best_accuracy, best_val_metrics, history, best_model_state

Note:不要轻易改模型结构,与其改模型结构来调整问题,不如相信就按照现在的结构继续做。问题往往意想不到。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/31 5:42:25

基于spring mvc和mybatis的网上食品零食商城系统视频vue3

目录 系统架构与技术栈核心功能模块技术实现要点数据库设计示例部署与扩展建议 项目技术支持可定制开发之功能亮点源码获取详细视频演示 :文章底部获取博主联系方式!同行可合作 系统架构与技术栈 Spring MVC MyBatis 作为后端框架,Vue3 作为…

作者头像 李华
网站建设 2026/10/31 11:06:10

常用的css

js控制样式&#xff1a; //html中&#xff1a;<text class"test_text" :style"{--base_color:currentColor}">测试</text>//data中:currentColor:pink //methods中&#xff1a;this.currentColorred//style中&#xff1a;使用变量取值.test_t…

作者头像 李华
网站建设 2026/10/30 21:01:45

枚举中间

lc lc2964 枚举中间hash class Solution { public: int divisibleTripletCount(vector<int>& nums, int d) { int n nums.size(); if (n < 3) return 0; int ret 0; unordered_map<int, int> hash; hash[nums[0] % d]; // 枚举中间 for (int i 1; i &l…

作者头像 李华
网站建设 2026/10/31 5:42:14

三菱PLC六层电梯控制系统设计含报告程序【程序与文档】(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)_文章底部可以扫码

三菱PLC六层电梯控制系统设计含报告程序【程序与文档】(设计源文件万字报告讲解)&#xff08;支持资料、图片参考_相关定制&#xff09;_文章底部可以扫码组态川基于三菱PLC的六层电梯控制系统设计[配套设计报告&#xff0c;程序&#xff0c;组态) 含基于三菱PLC的六层电梯控制…

作者头像 李华
网站建设 2026/10/31 7:44:05

如何通过单北斗GNSS实现高效的变形监测与位移监测?

在当前工程监测与地质灾害预警的背景下&#xff0c;单北斗GNSS技术愈发显得重要。它融合了高精度定位与实时数据传输&#xff0c;为各种监测需求提供了定制化解决方案。单北斗变形监测设备因其使用灵活、维护方便&#xff0c;广泛应用于基础设施建设、水坝监管等领域。同时&…

作者头像 李华
网站建设 2026/10/30 21:01:44

Spring AI Alibaba官方文档下载(V1.1版本)

前言 为了方便大家学习和查阅&#xff0c;我花了几小时从官方文档整理并重新排版了这份资料。为了节省打印成本&#xff0c;特意精简了非核心的 import 语句等冗余代码。内容干货满满&#xff0c;非常适合打印出来随时翻阅。欢迎下载学习&#xff0c;一起在 AI 时代共同进步&a…

作者头像 李华