news 2026/7/26 21:28:58

pythonstudy Day48

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
pythonstudy Day48

Tensorboard使用介绍

@疏锦行

import torch import torch.nn as nn import torch.optim as optim import torchvision from torchvision import datasets,transforms from torch.utils.data import DataLoader from torch.utils.tensorboard import SummaryWriter import numpy as np import matplotlib.pyplot as plt import os # 设置随机种子以确保结果可复现 torch.manual_seed(42)np.random.seed(42)#1.数据预处理 transform=transforms.Compose([transforms.ToTensor(),# 转换为张量 transforms.Normalize((0.5,0.5,0.5),(0.5,0.5,0.5))# 标准化处理])#2.加载CIFAR-10数据集 train_dataset=datasets.CIFAR10(root='./data',train=True,download=True,transform=transform)test_dataset=datasets.CIFAR10(root='./data',train=False,transform=transform)#3.创建数据加载器 batch_size=64train_loader=DataLoader(train_dataset,batch_size=batch_size,shuffle=True)test_loader=DataLoader(test_dataset,batch_size=batch_size,shuffle=False)#CIFAR-10的类别名称classes=('plane','car','bird','cat','deer','dog','frog','horse','ship','truck')#4.定义MLP模型(适应CIFAR-10的输入尺寸) classMLP(nn.Module):def__init__(self):super(MLP,self).__init__()self.flatten=nn.Flatten()# 将3x32x32的图像展平为3072维向量 self.layer1=nn.Linear(3072,512)# 第一层:3072个输入,512个神经元 self.relu1=nn.ReLU()self.dropout1=nn.Dropout(0.2)# 添加Dropout防止过拟合 self.layer2=nn.Linear(512,256)# 第二层:512个输入,256个神经元 self.relu2=nn.ReLU()self.dropout2=nn.Dropout(0.2)self.layer3=nn.Linear(256,10)# 输出层:10个类别 defforward(self,x):# 第一步:将输入图像展平为一维向量 x=self.flatten(x)# 输入尺寸:[batch_size,3,32,32][batch_size,3072]# 第一层全连接+激活+Dropout x=self.layer1(x)# 线性变换:[batch_size,3072][batch_size,512]x=self.relu1(x)# 应用ReLU激活函数 x=self.dropout1(x)# 训练时随机丢弃部分神经元输出 # 第二层全连接+激活+Dropout x=self.layer2(x)# 线性变换:[batch_size,512][batch_size,256]x=self.relu2(x)# 应用ReLU激活函数 x=self.dropout2(x)# 训练时随机丢弃部分神经元输出 # 第三层(输出层)全连接 x=self.layer3(x)# 线性变换:[batch_size,256][batch_size,10]returnx # 返回未经过Softmax的logits # 检查GPU是否可用 device=torch.device("cuda"iftorch.cuda.is_available()else"cpu")# 初始化模型 model=MLP()model=model.to(device)# 将模型移至GPU(如果可用) criterion=nn.CrossEntropyLoss()# 交叉熵损失函数 optimizer=optim.Adam(model.parameters(),lr=0.001)# Adam优化器 # 创建TensorBoard的SummaryWriter,指定日志保存目录 log_dir='runs/cifar10_mlp_experiment'# 如果目录已存在,添加后缀避免覆盖ifos.path.exists(log_dir):i=1whileos.path.exists(f"{log_dir}_{i}"):i+=1log_dir=f"{log_dir}_{i}"writer=SummaryWriter(log_dir)#5.训练模型(使用TensorBoard记录各种信息) deftrain(model,train_loader,test_loader,criterion,optimizer,device,epochs,writer):model.train()# 设置为训练模式 # 记录训练开始时间,用于计算训练速度 global_step=0# 可视化模型结构 dataiter=iter(train_loader)images,labels=next(dataiter)images=images.to(device)writer.add_graph(model,images)# 添加模型图 # 可视化原始图像样本 img_grid=torchvision.utils.make_grid(images[:8].cpu())writer.add_image('原始训练图像',img_grid)forepoch inrange(epochs):running_loss=0.0correct=0total=0forbatch_idx,(data,target)inenumerate(train_loader):data,target=data.to(device),target.to(device)# 移至GPU optimizer.zero_grad()# 梯度清零 output=model(data)# 前向传播 loss=criterion(output,target)# 计算损失 loss.backward()# 反向传播 optimizer.step()# 更新参数 # 统计准确率和损失 running_loss+=loss.item()_,predicted=output.max(1)total+=target.size(0)correct+=predicted.eq(target).sum().item()# 每100个批次记录一次信息到TensorBoardif(batch_idx+1)%100==0:batch_loss=loss.item()batch_acc=100.*correct/total # 记录标量数据(损失、准确率) writer.add_scalar('Train/Batch_Loss',batch_loss,global_step)writer.add_scalar('Train/Batch_Accuracy',batch_acc,global_step)# 记录学习率 writer.add_scalar('Train/Learning_Rate',optimizer.param_groups[0]['lr'],global_step)# 每500个批次记录一次直方图(权重和梯度)if(batch_idx+1)%500==0:forname,param in model.named_parameters():writer.add_histogram(f'weights/{name}',param,global_step)ifparam.grad is not None:writer.add_histogram(f'grads/{name}',param.grad,global_step)print(f'Epoch:{epoch+1}/{epochs}|Batch:{batch_idx+1}/{len(train_loader)}' f'|单Batch损失:{batch_loss:.4f}|累计平均损失:{running_loss/(batch_idx+1):.4f}')global_step+=1# 计算当前epoch的平均训练损失和准确率 epoch_train_loss=running_loss/len(train_loader)epoch_train_acc=100.*correct/total # 记录每个epoch的训练损失和准确率 writer.add_scalar('Train/Epoch_Loss',epoch_train_loss,epoch)writer.add_scalar('Train/Epoch_Accuracy',epoch_train_acc,epoch)# 测试阶段 model.eval()# 设置为评估模式 test_loss=0correct_test=0total_test=0# 用于存储预测错误的样本 wrong_images=[]wrong_labels=[]wrong_preds=[]with torch.no_grad():fordata,target in test_loader:data,target=data.to(device),target.to(device)output=model(data)test_loss+=criterion(output,target).item()_,predicted=output.max(1)total_test+=target.size(0)correct_test+=predicted.eq(target).sum().item()# 收集预测错误的样本 wrong_mask=(predicted!=target).cpu()ifwrong_mask.sum()>0:wrong_batch_images=data[wrong_mask].cpu()wrong_batch_labels=target[wrong_mask].cpu()wrong_batch_preds=predicted[wrong_mask].cpu()wrong_images.extend(wrong_batch_images)wrong_labels.extend(wrong_batch_labels)wrong_preds.extend(wrong_batch_preds)epoch_test_loss=test_loss/len(test_loader)epoch_test_acc=100.*correct_test/total_test # 记录每个epoch的测试损失和准确率 writer.add_scalar('Test/Loss',epoch_test_loss,epoch)writer.add_scalar('Test/Accuracy',epoch_test_acc,epoch)# 计算并记录训练速度(每秒处理的样本数) # 这里简化处理,假设每个epoch的时间相同 samples_per_epoch=len(train_loader.dataset)# 实际应用中应该使用time.time()来计算真实时间print(f'Epoch{epoch+1}/{epochs}完成|训练准确率:{epoch_train_acc:.2f}%|测试准确率:{epoch_test_acc:.2f}%')# 可视化预测错误的样本(只在最后一个epoch进行)ifepoch==epochs-1andlen(wrong_images)>0:# 最多显示8个错误样本 display_count=min(8,len(wrong_images))wrong_img_grid=torchvision.utils.make_grid(wrong_images[:display_count])# 创建错误预测的标签文本 wrong_text=[]fori inrange(display_count):true_label=classes[wrong_labels[i]]pred_label=classes[wrong_preds[i]]wrong_text.append(f'True:{true_label},Pred:{pred_label}')writer.add_image('错误预测样本',wrong_img_grid)writer.add_text('错误预测标签','\n'.join(wrong_text),epoch)# 关闭TensorBoard写入器 writer.close()returnepoch_test_acc # 返回最终测试准确率 #6.执行训练和测试 epochs=20# 训练轮次print("开始训练模型...")print(f"TensorBoard日志保存在: {log_dir}")print("训练完成后,使用命令 `tensorboard --logdir=runs` 启动TensorBoard查看可视化结果")final_accuracy=train(model,train_loader,test_loader,criterion,optimizer,device,epochs,writer)print(f"训练完成!最终测试准确率: {final_accuracy:.2f}%")
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/26 3:08:13

哔哩下载姬DownKyi:专业级B站视频获取终极指南

还在为无法离线收藏B站精彩内容而烦恼?DownKyi作为一款专为B站用户打造的智能视频下载工具,提供了从基础下载到高级处理的完整解决方案。无论你是想保存珍贵视频还是批量获取系列内容,这款开源工具都能满足你的多样化需求。 【免费下载链接】…

作者头像 李华
网站建设 2026/7/26 8:54:04

Keil5芯片包下载过程注意事项:零基础须知要点

Keil5芯片包下载避坑指南:新手也能一次成功的实战解析 你是不是也遇到过这样的情况?刚打开Keil5准备写第一行代码,新建项目时却发现下拉列表里找不到自己用的STM32型号;或者明明点了“Download”按钮,却弹出一个红色警…

作者头像 李华
网站建设 2026/7/26 16:18:47

显卡性能优化终极指南:如何用NVIDIA Profile Inspector实现游戏性能突破

还在为高端显卡在某些游戏中表现不佳而烦恼吗?画面撕裂、帧率不稳、输入延迟等问题正在影响你的游戏体验。NVIDIA Profile Inspector正是那把能够解锁显卡隐藏潜能的钥匙,让每一款游戏都能获得专属的性能优化方案。 【免费下载链接】nvidiaProfileInspec…

作者头像 李华
网站建设 2026/7/24 21:31:57

Qwen3-VL集成FastStone Capture:截图即分析的办公利器

Qwen3-VL集成FastStone Capture:截图即分析的办公利器 在当今办公场景中,截图早已成为信息传递的核心方式之一。无论是提交Bug报告、撰写操作手册,还是远程技术支持,我们每天都在反复进行“截一张图 → 描述它 → 等待反馈”的流程…

作者头像 李华
网站建设 2026/7/24 21:31:56

手机号码精准定位系统:快速查询地理位置的技术实现方案

手机号码精准定位系统:快速查询地理位置的技术实现方案 【免费下载链接】location-to-phone-number This a project to search a location of a specified phone number, and locate the map to the phone number location. 项目地址: https://gitcode.com/gh_mir…

作者头像 李华
网站建设 2026/7/23 1:45:43

Qwen3-VL急救指挥系统:事故现场图像快速研判决策

Qwen3-VL急救指挥系统:事故现场图像快速研判决策 在一场突发交通事故中,每一秒都关乎生命。救援人员赶到现场后拍摄的照片,往往包含大量关键信息——车辆损毁程度、人员倒地姿态、道路标识指向、是否有起火风险……但传统流程下,这…

作者头像 李华