ADVANCE Day45

@浙大疏锦行

📘 Day 45 实战作业:给模型装上仪表盘 —— TensorBoard 实战

1. 作业综述

核心目标

  1. 环境搭建:安装并启动 TensorBoard。
  2. 指标监控 (Scalar):不再盯着控制台刷屏,而是画出漂亮的LossAccuracy曲线,对比训练集和测试集的差异。
  3. 模型透视 (Graph):可视化神经网络的结构图 (Computational Graph)。
  4. 视觉验证 (Images):在 TensorBoard 里直接查看模型预测错误的图片。

涉及知识点

  • SummaryWriter: TensorBoard 的核心记录员。
  • add_scalar: 记录数字指标。
  • add_image: 记录图像数据。
  • add_graph: 记录模型结构。
  • Magic Command: 在 Jupyter 里直接嵌入 TensorBoard。

场景类比

  • Print 日志: 像是医生的手写病历,枯燥且难以分析趋势。
  • TensorBoard: 像是ICU里的心电监护仪,实时跳动,一目了然。

步骤 1:初始化记录员 (Writer Setup)

核心概念
TensorBoard 的工作原理是:

  1. Python 代码往一个文件夹(比如runs/experiment_1)里写日志文件。
  2. TensorBoard 程序读取这个文件夹,并在网页上渲染出图表。

任务

  1. 定义 CIFAR-10 的数据管道(复用 Day 44 的极速版配置)。
  2. 初始化SummaryWriter
importtorchimporttorch.nnasnnimporttorch.optimasoptimfromtorchvisionimportdatasets,transforms,models,utilsfromtorch.utils.dataimportDataLoaderfromtorch.utils.tensorboardimportSummaryWriter# 核心组件importnumpyasnpimportmatplotlib.pyplotasplt# 1. 准备数据 (复用 Day 44 极速版配置)IMG_SIZE=112BATCH_SIZE=64transform=transforms.Compose([transforms.Resize(IMG_SIZE),transforms.ToTensor(),transforms.Normalize((0.5,0.5,0.5),(0.5,0.5,0.5))])train_dataset=datasets.CIFAR10(root='./data',train=True,download=True,transform=transform)test_dataset=datasets.CIFAR10(root='./data',train=False,download=True,transform=transform)train_loader=DataLoader(train_dataset,batch_size=BATCH_SIZE,shuffle=True,num_workers=2)test_loader=DataLoader(test_dataset,batch_size=BATCH_SIZE,shuffle=False,num_workers=2)device=torch.device("cuda"iftorch.cuda.is_available()else"cpu")# 2. 初始化 TensorBoard 记录器# log_dir 是日志存放的路径,每次实验建议改个名字,比如 'runs/exp1', 'runs/exp2'writer=SummaryWriter('runs/cifar10_resnet_experiment')print("✅ TensorBoard Writer 已就绪!日志将写入 runs/cifar10_resnet_experiment")
✅ TensorBoard Writer 已就绪!日志将写入 runs/cifar10_resnet_experiment

步骤 2:可视化模型结构与图片

任务
在开始训练前,我们先往 TensorBoard 里存点东西看看效果。

  1. 看图: 把一个 Batch 的图片拼成网格,存进去。
  2. 看模型: 把 ResNet18 的结构图存进去。
# 1. 获取一个 Batch 的数据images,labels=next(iter(train_loader))# 2. 写入图片网格 (add_image)# make_grid 会把 64 张图拼成一张大图img_grid=utils.make_grid(images)# 反归一化以便显示正常颜色 (可选)img_grid_show=img_grid*0.5+0.5writer.add_image('CIFAR10_Input_Images',img_grid_show)# 3. 写入模型结构 (add_graph)# 需要传入模型实例和一个样例输入 (input_to_model)model=models.resnet18(pretrained=False)# 演示用,不加载权重也没事model.fc=nn.Linear(512,10)model=model.to(device)# 注意:add_graph 需要输入也在对应的 device 上dummy_input=images.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 `weights=None`. warnings.warn(msg) ✅ 图片和模型结构已写入!请稍后在 TensorBoard 查看。

步骤 3:在训练循环中埋点

核心逻辑
我们需要在traintest的循环里插入writer.add_scalar

  • tag (标签): 比如'Loss/train','Accuracy/test'。TensorBoard 会根据标签自动分组。
  • scalar_value (数值): y 轴的值。
  • global_step (步数): x 轴的值(通常是 epoch 或 iteration)。

任务
修改训练循环,实时记录 Loss 和 Accuracy。

# 重新定义一个简单的训练函数,集成 TensorBoarddeftrain_with_tensorboard(model,epochs=5):criterion=nn.CrossEntropyLoss()optimizer=optim.Adam(model.parameters(),lr=0.001)# 记录全局步数 (iteration)step=0forepochinrange(epochs):print(f"Epoch{epoch+1}/{epochs}starting...")# --- 训练阶段 ---model.train()running_loss=0.0fori,(inputs,targets)inenumerate(train_loader):inputs,targets=inputs.to(device),targets.to(device)optimizer.zero_grad()outputs=model(inputs)loss=criterion(outputs,targets)loss.backward()optimizer.step()running_loss+=loss.item()# [埋点 1] 每 100 个 Batch 记录一次训练 Loss# x轴使用 step (平滑连续),而不是 epochifi%100==99:writer.add_scalar('Loss/train',running_loss/100,global_step=step)running_loss=0.0step+=1# --- 测试阶段 (每个 Epoch 结束后测一次) ---model.eval()correct=0total=0test_loss=0.0withtorch.no_grad():forinputs,targetsintest_loader:inputs,targets=inputs.to(device),targets.to(device)outputs=model(inputs)loss=criterion(outputs,targets)test_loss+=loss.item()_,predicted=outputs.max(1)total+=targets.size(0)correct+=predicted.eq(targets).sum().item()acc=100.*correct/total avg_test_loss=test_loss/len(test_loader)# [埋点 2] 记录测试集的 Accuracy 和 Loss# x轴使用 epochwriter.add_scalar('Accuracy/test',acc,global_step=epoch)writer.add_scalar('Loss/test',avg_test_loss,global_step=epoch)print(f"Epoch{epoch+1}finished. Test Acc:{acc:.2f}%")# 开始训练 (演示跑 3 轮即可)train_with_tensorboard(model,epochs=3)# 记得关闭 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:启动仪表盘

两种方式

  1. 命令行 (推荐):打开 Anaconda Prompt 或终端,进入当前代码目录,输入:

    tensorboard --logdir=runs

    然后浏览器访问http://localhost:6006

  2. Jupyter 魔术命令:直接在 Notebook 里显示(如下所示)。

# 加载 TensorBoard 扩展%load_ext tensorboard# 启动 TensorBoard,指定日志目录# 端口设为 6006 (默认)%tensorboard--logdir=runs--port=6006

🎓 Day 45 总结:可视化分析

今天我们给 AI 模型装上了“眼睛”。通过 TensorBoard,你应该能看到:

  1. SCALARS: 随着训练进行,Loss 曲线在震荡中下降,Accuracy 曲线在上升。如果 Loss 曲线长时间不下降,或者 Test Loss 开始上升,你就知道该调整学习率或早停了。
  2. GRAPHS: 帅气的 ResNet18 流程图,展示了数据是如何一层层流动的。
  3. IMAGES: 我们喂给模型的图片长什么样。

工业界经验:

  • 永远不要只看最后的 Acc。Loss 曲线的斜率、震荡幅度包含了关于学习率是否合适、Batch Size 是否合理的巨大信息量。
  • 同时记录Train LossTest Loss,看它们何时分叉,那是过拟合 (Overfitting)开始的信号。

Next Level:
到今天为止,我们的深度学习基础篇 (CV 方向)已经非常扎实了。
明天(Day 46),我们将迈出最后一步 ——模型部署 (Deployment)。我们要把训练好的模型打包成一个 Web 服务,让别人通过浏览器就能上传图片并得到识别结果!

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

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

相关文章

2026年转行AI大模型必备:两个高薪岗位,让你年后求职弯道超车

文章指出当前就业市场低迷,但春节后很快进入春招旺季,建议现在就开始准备。重点推荐两个普通人也能入行的AI方向:AI大模型应用开发师(年薪最高72万)和AI大模型训练师(年薪最高45万)。AI行业正处…

一文搞清微调技术的发展与演进

现在的大语言模型发展得非常快,从几亿参数到千亿参数,不仅模型越来越大,能力也越来越强。但是在实际工作中,我们很少会从零开始训练一个这样的巨无霸模型,因为那样的成本和资源需求实在太高了。更多的时候,…

linux的root目录缓存清理

1. 找出隐藏的大文件 / 文件夹(关键步骤)先执行以下命令,查看 /root 下所有文件(包括隐藏文件) 的空间占用,定位具体占用空间的文件:# 查看/root下所有文件(含隐藏)的空间…

【收藏】LLM大模型全景解析:从零开始理解AI智能的诞生

LLM大模型是基于Transformer架构的海量参数模型,通过规模效应、自注意力机制和训练范式调整实现通用智能。工作流程包括分词、嵌入表示、多层Transformer堆叠和概率预测,实现数据压缩→规律学习→智能涌现。LLM有Decoder-Only、Encoder-Only和Encoder-De…

深度学习计算机毕设之通过python_CNN卷积神经网络对鸡蛋是否破损识别

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

mysql之联合索引

文章目录 一:联合索引二:创建联合索引三:删除索引四:总结: 一:联合索引 联合索引又称组合索引或者复合索引,是建立在俩列或者多列以上的索引。 二:创建联合索引 语法&#xff1a…

mysql之字符串函数

假设我们有一个字符串 Hello, World! 作为示例,我们会展示对这个字符串应用每个函数后的结果。 CONCAT(str1, str2, …) 将多个字符串值连接成一个字符串。 SELECT CONCAT(Hello, , World!); -- 结果: Hello, World!LENGTH(str) 返回字符串的长度(字节数…

大模型入门必看:一篇读懂AI大模型核心知识,建议收藏!

本文全面介绍了AI大模型家族的基础知识,包括AIGC的两种类型和三个发展阶段,详细解释了AI、机器学习、深度学习、生成式AI和大语言模型之间的关系与区别。重点阐述了Transformer架构及其自注意力机制在大语言模型中的核心作用,以及大语言模型的…

MySQL如何删除binlog日志文件

MySQL如何删除binlog日志文件呢? 1、使用命令手动在操作系统中删除,但是这种删除并没有从数据库逻辑层面删除,数据库里还记录着这条日志,可能会有一些问题。 进入到MySQL数据目录下,rm -rf 日志文件2、使用SQL命令删除&#xff0c…

js遍历数组和对象的常用方法有哪些?

精通 JS 遍历:数组与对象的高效遍历方法论(2026 版)遍历是 JavaScript 数据处理的基石,从前端 DOM 渲染到后端数据聚合,几乎所有业务场景都离不开数组和对象的遍历操作。但新手常陷入 “方法用错、性能低效、边界踩坑”…

NAT技术:互联网连接的隐形桥梁

目录 一、NAT 技术:从地址短缺到连接复用 1、背景:IPv4 地址枯竭与私有地址的诞生 2、基本 NAT(Basic NAT):一对一地址转换 工作原理: 示例: 局限性: 3、NAPT(Net…

Redis的两个小错误

说明:本文介绍关于自己遇到的 Redis 相关的两个小错误 问题一:配置没生效 在 Linux 中启动 redis 服务,发现配置文件中的设置没有起作用,设置了密码和可访问地址,没用 发现没起作用,我在服务器上启动 red…

深度学习计算机毕设之基于人工智能python-CNN卷积神经网络对土豆疾病识别基于python-CNN卷积神经网络对土豆疾病识别

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

mysql如何创建用户并且授权

在 MySQL 中可以使用以下步骤创建用户: 1.使用管理员账户登录到 MySQL: - 打开命令行终端,输入以下命令以管理员身份登录 MySQL(假设 MySQL 安装在默认位置且管理员用户为root,密码为your_root_password)&a…

Springboot校园二手交易平台lca16(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。

系统程序文件列表项目功能:商品分类,用户,二手商品开题报告内容一、选题背景与意义(一)选题背景随着高等教育的普及和校园生活的丰富多彩,大学生在日常学习和生活中产生了大量的闲置物品,如书籍、电子产品、生活用品等…

深度学习毕设项目:基于python-CNN卷积神经网络的水果识别

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

NSSCTF2026年1月8日每日一练之[第五空间 2021]WebFTP

开启环境,进入页面得到先进行目录扫描 python dirsearch.py -u http://node4.anna.nssctf.cn:26891/扫描得到看到phpinfo.php,猜测可能存在php版本等相关敏感信息,访问一下搜索ctf或者flag,可以得到最终结果得到最终结果 NSSCTF{b…

ADVANCE Day44

浙大疏锦行 📘 Day 44 实战作业 (极速版):ResNet 与 迁移学习 1. 作业综述 核心目标: 迁移学习:学会调用 ImageNet 预训练的 ResNet18 模型,将其知识迁移到 CIFAR-10 任务上。策略对比:亲手实验 冻结骨…

深度学习毕设项目:基于python-CNN卷积神经网络对土豆疾病识别基于python-CNN卷积神经网络对土豆疾病识别

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…