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

DAY 35 模型可视化与推理

知识点回顾:

  1. 三种不同的模型可视化方法:推荐torchinfo打印summary+权重分布可视化
  2. 进度条功能:手动和自动写法,让打印结果更加美观
  3. 推理的写法:评估模式

作业:调整模型定义时的超参数,对比下效果。

import torch
import torch.nn as nn
import torch.optim as optim
from torchvision import datasets, transforms
from torch.utils.data import DataLoader
from torchinfo import summary
import matplotlib.pyplot as plt
import numpy as np
from tqdm import tqdm# 设置随机种子确保结果可复现
torch.manual_seed(42)
np.random.seed(42)# 定义数据预处理
transform = transforms.Compose([transforms.ToTensor(),transforms.Normalize((0.1307,), (0.3081,))  # MNIST数据集的均值和标准差
])# 加载MNIST数据集
train_dataset = datasets.MNIST('data', train=True, download=True, transform=transform)
test_dataset = datasets.MNIST('data', train=False, transform=transform)# 定义超参数配置
configs = [{'name': ' baseline','hidden_size': 128,'learning_rate': 0.01,'batch_size': 64,'activation': 'relu'},{'name': '增加隐藏层大小','hidden_size': 256,'learning_rate': 0.01,'batch_size': 64,'activation': 'relu'},{'name': '降低学习率','hidden_size': 128,'learning_rate': 0.001,'batch_size': 64,'activation': 'relu'},{'name': '增加批量大小','hidden_size': 128,'learning_rate': 0.01,'batch_size': 128,'activation': 'relu'},{'name': '使用LeakyReLU','hidden_size': 128,'learning_rate': 0.01,'batch_size': 64,'activation': 'leaky_relu'}
]# 定义模型
class MLP(nn.Module):def __init__(self, hidden_size=128, activation='relu'):super(MLP, self).__init__()self.fc1 = nn.Linear(28 * 28, hidden_size)self.fc2 = nn.Linear(hidden_size, hidden_size)self.fc3 = nn.Linear(hidden_size, 10)# 根据配置选择激活函数if activation == 'relu':self.activation = nn.ReLU()elif activation == 'leaky_relu':self.activation = nn.LeakyReLU()else:raise ValueError(f"不支持的激活函数: {activation}")def forward(self, x):x = x.view(-1, 28 * 28)x = self.activation(self.fc1(x))x = self.activation(self.fc2(x))x = self.fc3(x)return x# 训练和评估函数
def train_and_evaluate(config):# 创建数据加载器train_loader = DataLoader(train_dataset, batch_size=config['batch_size'], shuffle=True)test_loader = DataLoader(test_dataset, batch_size=config['batch_size'])# 初始化模型model = MLP(hidden_size=config['hidden_size'], activation=config['activation'])# 打印模型摘要print(f"\n=== {config['name']} 模型摘要 ===")summary(model, input_size=(1, 28, 28))# 定义损失函数和优化器criterion = nn.CrossEntropyLoss()optimizer = optim.Adam(model.parameters(), lr=config['learning_rate'])# 训练模型device = torch.device("cuda" if torch.cuda.is_available() else "cpu")model.to(device)train_losses = []test_accuracies = []print(f"\n=== 训练 {config['name']} 模型 ===")for epoch in range(5):  # 训练5个epochmodel.train()running_loss = 0.0# 使用tqdm显示进度条progress_bar = tqdm(enumerate(train_loader), total=len(train_loader))for batch_idx, (data, target) in progress_bar:data, target = data.to(device), target.to(device)optimizer.zero_grad()output = model(data)loss = criterion(output, target)loss.backward()optimizer.step()running_loss += loss.item()progress_bar.set_description(f'Epoch {epoch+1}, Batch {batch_idx+1}/{len(train_loader)}, Loss: {loss.item():.4f}')# 记录训练损失epoch_loss = running_loss / len(train_loader)train_losses.append(epoch_loss)# 评估模型model.eval()  # 设置为评估模式test_correct = 0test_total = 0with torch.no_grad():  # 关闭梯度计算以加速推理for data, target in test_loader:data, target = data.to(device), target.to(device)output = model(data)_, predicted = torch.max(output.data, 1)test_total += target.size(0)test_correct += (predicted == target).sum().item()test_accuracy = 100.0 * test_correct / test_totaltest_accuracies.append(test_accuracy)print(f'Epoch {epoch+1}, 训练损失: {epoch_loss:.4f}, 测试准确率: {test_accuracy:.2f}%')# 可视化权重分布visualize_weight_distribution(model, config['name'])return train_losses, test_accuracies# 可视化权重分布
def visualize_weight_distribution(model, config_name):weights = []for name, param in model.named_parameters():if 'weight' in name:weights.append(param.cpu().detach().numpy().flatten())plt.figure(figsize=(10, 6))plt.hist(weights, bins=50, label=[name for name, param in model.named_parameters() if 'weight' in name])plt.title(f'{config_name} 模型权重分布')plt.xlabel('权重值')plt.ylabel('频率')plt.legend()plt.tight_layout()plt.savefig(f'{config_name}_weights.png')plt.close()# 运行所有配置并比较结果
results = {}
for config in configs:train_losses, test_accuracies = train_and_evaluate(config)results[config['name']] = {'train_losses': train_losses,'test_accuracies': test_accuracies,'final_accuracy': test_accuracies[-1]}# 比较不同配置的最终准确率
plt.figure(figsize=(12, 6))
plt.bar([config['name'] for config in configs], [results[config['name']]['final_accuracy'] for config in configs])
plt.title('不同超参数配置的最终测试准确率')
plt.xlabel('配置')
plt.ylabel('准确率 (%)')
plt.ylim(95, 100)  # 设置合适的y轴范围以便更好地比较
plt.xticks(rotation=45, ha='right')
plt.tight_layout()
plt.savefig('hyperparameter_comparison.png')
plt.show()# 打印最终结果
print("\n=== 最终结果比较 ===")
for config in configs:print(f"{config['name']}: 最终准确率 = {results[config['name']]['final_accuracy']:.2f}%")    

=== 最终结果比较 ===
 baseline: 最终准确率 = 96.05%
增加隐藏层大小: 最终准确率 = 95.38%
降低学习率: 最终准确率 = 97.64%
增加批量大小: 最终准确率 = 96.49%
使用LeakyReLU: 最终准确率 = 96.32%

http://www.xdnf.cn/news/8685.html

相关文章:

  • 力扣面试150题--求根节点到叶节点数字之和
  • 如何屏蔽mac电脑更新提醒,禁止系统更新(最新有效方法)
  • 5060显卡驱动PyCUDA开发环境搭建
  • 25. 日志装饰器的开发
  • 使用 Go 语言实现完整且轻量级高性能的 MQTT Broker
  • Vue3 Composition API: 企业级应用最佳实践方案
  • SDL2常用函数:SDL_Texture 数据结构及使用介绍
  • 微信小程序数据接收
  • 数据结构---二叉树
  • 基于python的机器学习(九)—— 评估算法(二)
  • OpenLayers 开发环境搭建
  • 初识 RocketMQ 知识总结:基础概念、架构解析、核心特性与应用场景
  • 解决“uv 无法识别为命令”问题:Windows 下 Python 工具安装后的路径配置方法
  • 国际前沿知识系列五:时间序列建模方法在头部撞击运动学测量数据降噪中的应用
  • Spring Cloud Gateway 微服务网关实战指南
  • python操作MySQL数据库
  • 再论自然数全加和-4
  • laravel中模型中$fillable的用法
  • DeepSeek-R1 模型现已在亚马逊云科技上推出
  • 再谈Linux进程:进程等待、进程替换与环境变量
  • 第七章:组件之城 · 重构世界的拼图术
  • RabbitMQ 快速上手
  • 【RichTextEditor】 【分析2】RichTextEditor设置文字内容背景色
  • 第八章:数据库查询优化
  • 上升沿计数 stm32 中断
  • 用service 和 SCAN实现sqlplus/jdbc连接Oracle 11g RAC时负载均衡
  • 在Mac中使用pyenv管理Python版本:从安装到虚拟环境的全流程指南
  • 物联网网关保障沼气发电站安全运行的关键技术解析
  • 文章记单词 | 第111篇(六级)
  • 江科大ADC模数转换hal库实现