2026/3/2 6:20:31
网站建设
项目流程
上海青浦做网站,线上推广宣传方式有哪些,wordpress 柒比贰2.,网站备案中国开头浙大疏锦行
#x1f4d8; Day 45 实战作业#xff1a;给模型装上仪表盘 —— TensorBoard 实战
1. 作业综述
核心目标#xff1a;
环境搭建#xff1a;安装并启动 TensorBoard。指标监控 (Scalar)#xff1a;不再盯着控制台刷屏#xff0c;而是画出漂亮的 Loss 和 Ac…浙大疏锦行 Day 45 实战作业给模型装上仪表盘 —— TensorBoard 实战1. 作业综述核心目标环境搭建安装并启动 TensorBoard。指标监控 (Scalar)不再盯着控制台刷屏而是画出漂亮的Loss和Accuracy曲线对比训练集和测试集的差异。模型透视 (Graph)可视化神经网络的结构图 (Computational Graph)。视觉验证 (Images)在 TensorBoard 里直接查看模型预测错误的图片。涉及知识点SummaryWriter: TensorBoard 的核心记录员。add_scalar: 记录数字指标。add_image: 记录图像数据。add_graph: 记录模型结构。Magic Command: 在 Jupyter 里直接嵌入 TensorBoard。场景类比Print 日志: 像是医生的手写病历枯燥且难以分析趋势。TensorBoard: 像是ICU里的心电监护仪实时跳动一目了然。步骤 1初始化记录员 (Writer Setup)核心概念TensorBoard 的工作原理是Python 代码往一个文件夹比如runs/experiment_1里写日志文件。TensorBoard 程序读取这个文件夹并在网页上渲染出图表。任务定义 CIFAR-10 的数据管道复用 Day 44 的极速版配置。初始化SummaryWriter。importtorchimporttorch.nnasnnimporttorch.optimasoptimfromtorchvisionimportdatasets,transforms,models,utilsfromtorch.utils.dataimportDataLoaderfromtorch.utils.tensorboardimportSummaryWriter# 核心组件importnumpyasnpimportmatplotlib.pyplotasplt# 1. 准备数据 (复用 Day 44 极速版配置)IMG_SIZE112BATCH_SIZE64transformtransforms.Compose([transforms.Resize(IMG_SIZE),transforms.ToTensor(),transforms.Normalize((0.5,0.5,0.5),(0.5,0.5,0.5))])train_datasetdatasets.CIFAR10(root./data,trainTrue,downloadTrue,transformtransform)test_datasetdatasets.CIFAR10(root./data,trainFalse,downloadTrue,transformtransform)train_loaderDataLoader(train_dataset,batch_sizeBATCH_SIZE,shuffleTrue,num_workers2)test_loaderDataLoader(test_dataset,batch_sizeBATCH_SIZE,shuffleFalse,num_workers2)devicetorch.device(cudaiftorch.cuda.is_available()elsecpu)# 2. 初始化 TensorBoard 记录器# log_dir 是日志存放的路径每次实验建议改个名字比如 runs/exp1, runs/exp2writerSummaryWriter(runs/cifar10_resnet_experiment)print(✅ TensorBoard Writer 已就绪日志将写入 runs/cifar10_resnet_experiment)✅ TensorBoard Writer 已就绪日志将写入 runs/cifar10_resnet_experiment步骤 2可视化模型结构与图片任务在开始训练前我们先往 TensorBoard 里存点东西看看效果。看图: 把一个 Batch 的图片拼成网格存进去。看模型: 把 ResNet18 的结构图存进去。# 1. 获取一个 Batch 的数据images,labelsnext(iter(train_loader))# 2. 写入图片网格 (add_image)# make_grid 会把 64 张图拼成一张大图img_gridutils.make_grid(images)# 反归一化以便显示正常颜色 (可选)img_grid_showimg_grid*0.50.5writer.add_image(CIFAR10_Input_Images,img_grid_show)# 3. 写入模型结构 (add_graph)# 需要传入模型实例和一个样例输入 (input_to_model)modelmodels.resnet18(pretrainedFalse)# 演示用不加载权重也没事model.fcnn.Linear(512,10)modelmodel.to(device)# 注意add_graph 需要输入也在对应的 device 上dummy_inputimages.to(device)writer.add_graph(model,dummy_input)print(✅ 图片和模型结构已写入请稍后在 TensorBoard 查看。)e:\Anaconda\envs\test\lib\site-packages\torchvision\models\_utils.py:208: UserWarning: The parameter pretrained is deprecated since 0.13 and may be removed in the future, please use weights instead. warnings.warn( e:\Anaconda\envs\test\lib\site-packages\torchvision\models\_utils.py:223: UserWarning: Arguments other than a weight enum or None for weights are deprecated since 0.13 and may be removed in the future. The current behavior is equivalent to passing weightsNone. warnings.warn(msg) ✅ 图片和模型结构已写入请稍后在 TensorBoard 查看。步骤 3在训练循环中埋点核心逻辑我们需要在train和test的循环里插入writer.add_scalar。tag (标签): 比如Loss/train,Accuracy/test。TensorBoard 会根据标签自动分组。scalar_value (数值): y 轴的值。global_step (步数): x 轴的值通常是 epoch 或 iteration。任务修改训练循环实时记录 Loss 和 Accuracy。# 重新定义一个简单的训练函数集成 TensorBoarddeftrain_with_tensorboard(model,epochs5):criterionnn.CrossEntropyLoss()optimizeroptim.Adam(model.parameters(),lr0.001)# 记录全局步数 (iteration)step0forepochinrange(epochs):print(fEpoch{epoch1}/{epochs}starting...)# --- 训练阶段 ---model.train()running_loss0.0fori,(inputs,targets)inenumerate(train_loader):inputs,targetsinputs.to(device),targets.to(device)optimizer.zero_grad()outputsmodel(inputs)losscriterion(outputs,targets)loss.backward()optimizer.step()running_lossloss.item()# [埋点 1] 每 100 个 Batch 记录一次训练 Loss# x轴使用 step (平滑连续)而不是 epochifi%10099:writer.add_scalar(Loss/train,running_loss/100,global_stepstep)running_loss0.0step1# --- 测试阶段 (每个 Epoch 结束后测一次) ---model.eval()correct0total0test_loss0.0withtorch.no_grad():forinputs,targetsintest_loader:inputs,targetsinputs.to(device),targets.to(device)outputsmodel(inputs)losscriterion(outputs,targets)test_lossloss.item()_,predictedoutputs.max(1)totaltargets.size(0)correctpredicted.eq(targets).sum().item()acc100.*correct/total avg_test_losstest_loss/len(test_loader)# [埋点 2] 记录测试集的 Accuracy 和 Loss# x轴使用 epochwriter.add_scalar(Accuracy/test,acc,global_stepepoch)writer.add_scalar(Loss/test,avg_test_loss,global_stepepoch)print(fEpoch{epoch1}finished. Test Acc:{acc:.2f}%)# 开始训练 (演示跑 3 轮即可)train_with_tensorboard(model,epochs3)# 记得关闭 writer否则部分数据可能还没写进硬盘writer.close()Epoch 1/3 starting... Epoch 1 finished. Test Acc: 62.03% Epoch 2/3 starting... Epoch 2 finished. Test Acc: 69.76% Epoch 3/3 starting... Epoch 3 finished. Test Acc: 75.44%步骤 4启动仪表盘两种方式命令行 (推荐)打开 Anaconda Prompt 或终端进入当前代码目录输入tensorboard --logdirruns然后浏览器访问http://localhost:6006。Jupyter 魔术命令直接在 Notebook 里显示如下所示。# 加载 TensorBoard 扩展%load_ext tensorboard# 启动 TensorBoard指定日志目录# 端口设为 6006 (默认)%tensorboard--logdirruns--port6006 Day 45 总结可视化分析今天我们给 AI 模型装上了“眼睛”。通过 TensorBoard你应该能看到SCALARS: 随着训练进行Loss 曲线在震荡中下降Accuracy 曲线在上升。如果 Loss 曲线长时间不下降或者 Test Loss 开始上升你就知道该调整学习率或早停了。GRAPHS: 帅气的 ResNet18 流程图展示了数据是如何一层层流动的。IMAGES: 我们喂给模型的图片长什么样。工业界经验:永远不要只看最后的 Acc。Loss 曲线的斜率、震荡幅度包含了关于学习率是否合适、Batch Size 是否合理的巨大信息量。同时记录Train Loss和Test Loss看它们何时分叉那是过拟合 (Overfitting)开始的信号。Next Level:到今天为止我们的深度学习基础篇 (CV 方向)已经非常扎实了。明天Day 46我们将迈出最后一步 ——模型部署 (Deployment)。我们要把训练好的模型打包成一个 Web 服务让别人通过浏览器就能上传图片并得到识别结果