DataWhale 二月组队学习-深入浅出pytorch-Task05
特点:快速生成网络结构的文本描述安装与使用# 安装!# 使用示例summary(model, input_size=(3, 224, 224)) # 输入尺寸输出示例...TensorBoard是TensorFlow开发的交互式可视化工具,PyTorch通过训练指标监控:损失、准确率等标量数据曲线模型结构可视化:计算图与网络层次结构特征图/卷积核可视化:激活与权重的空间分布梯度分布分析:参数更新动
·
一、可视化网络结构
一、为什么需要可视化网络结构?
- 模型调试:帮助发现网络层的连接错误
- 参数统计:直观查看参数量与计算量
- 结构优化:辅助设计更高效的网络架构
- 学术交流:论文与报告中直观展示模型结构
二、常用可视化工具及方法
方法1:torchsummary(文本摘要)
特点:快速生成网络结构的文本描述
安装与使用:
# 安装
!pip install torchsummary
# 使用示例
from torchsummary import summary
model = YourModel()
summary(model, input_size=(3, 224, 224)) # 输入尺寸
输出示例:
----------------------------------------------------------------
Layer (type) Output Shape Param #
================================================================
Conv2d-1 [-1, 64, 224, 224] 1,792
ReLU-2 [-1, 64, 224, 224] 0
MaxPool2d-3 [-1, 64, 112, 112] 0
...
================================================================
Total params: 3,536,960
Trainable params: 3,536,960
Non-trainable params: 0
----------------------------------------------------------------
方法2:torchviz(图形可视化)
特点:生成计算图的可视化图形
安装与使用:
# 安装(需要先安装Graphviz)
!pip install torchviz
# Windows系统需单独安装Graphviz:https://graphviz.org/download/
# 使用示例
from torchviz import make_dot
x = torch.randn(1, 3, 224, 224)
y = model(x)
dot = make_dot(y, params=dict(model.named_parameters()))
dot.render("model_graph") # 生成PDF文件
输出效果:
- 生成PDF格式的计算图
- 节点显示层类型和参数维度
- 箭头表示数据流向
方法3:Netron(模型结构查看器)
特点:支持多种格式的模型可视化
使用方式:
- 在线使用:访问 Netron
- 本地安装:支持Windows/Mac/Linux
- 支持的格式:
- PyTorch (.pt, .pth)
- ONNX (.onnx)
- TensorFlow (.pb)
- Keras (.h5)
操作流程:
# 保存PyTorch模型
torch.save(model, 'model.pth')
# 使用Netron打开保存的模型文件
界面特点:
- 分层显示网络结构
- 点击节点查看详细参数
- 支持缩放和布局调整
三、工具对比与选择建议
工具 | 可视化形式 | 交互性 | 安装复杂度 | 适用场景 |
---|---|---|---|---|
torchsummary | 文本摘要 | 低 | 简单 | 快速查看参数统计 |
torchviz | 计算图 | 中 | 中等 | 理解数据流向,调试计算图 |
Netron | 结构图 | 高 | 简单 | 直观查看整体架构,支持多种格式 |
选择建议:
- 快速参数统计 → torchsummary
- 调试计算图 → torchviz
- 分享与展示 → Netron
- 多框架支持 → Netron
二、CNN可视化
一、卷积核可视化
1. 核心概念
卷积核是CNN中的可学习参数,每个卷积核负责从输入中提取特定特征。通过可视化卷积核,可以直观理解网络学习到的底层模式(如边缘、纹理等)。
2. 实现步骤
-
获取卷积核权重:通过
model.weight
访问目标卷积层的权重张量。import torch from torchvision.models import vgg16 model = vgg16(pretrained=True) kernels = model.features[0].weight # 第一个卷积层的权重
-
数据预处理:
- 归一化:将张量值缩放到[0, 1]区间。
- 调整维度:卷积核形状为
(out_channels, in_channels, kH, kW)
,需转换为(kH, kW, in_channels)
以便可视化。
kernel = kernels[0].detach().cpu() # 示例:第一个输出通道的卷积核 kernel = kernel - kernel.min() # 归一化 kernel = kernel / kernel.max() kernel = kernel.permute(1, 2, 0) # (C_in, H, W) → (H, W, C_in)
-
可视化:
import matplotlib.pyplot as plt plt.imshow(kernel) plt.axis('off') plt.show()
3. 示例结果
- VGG16首层卷积核:显示为3×3×3的RGB小方块,可能对应颜色、边缘等基础特征检测器。
二、特征图可视化
1. 核心概念
特征图是输入经过卷积操作后的输出,反映不同卷积核对输入图像的响应。可视化特征图可观察网络对输入特征的激活情况。
2. 实现方法
方法:直接获取中间层输出
-
注册前向钩子:捕获目标层的输出。
activation = None def hook_fn(module, input, output): global activation activation = output.detach() target_layer = model.features[0] # 目标层 hook = target_layer.register_forward_hook(hook_fn)
-
前向传播:
input_image = torch.randn(1, 3, 224, 224) # 示例输入 output = model(input_image)
-
处理特征图:
- 维度调整:特征图形状为
(batch, channels, H, W)
,取首个样本并压缩批次维度。 - 归一化与可视化:
act = activation[0] # 取batch中第一个样本 for i in range(act.size(0)): # 遍历通道 channel_act = act[i] plt.subplot(8, 8, i+1) # 假设64通道,排列为8x8网格 plt.imshow(channel_act, cmap='gray') plt.axis('off') plt.show()
- 维度调整:特征图形状为
三、使用TensorBoard可视化训练过程
一、TensorBoard简介与安装
1. 核心功能
TensorBoard是TensorFlow开发的交互式可视化工具,PyTorch通过torch.utils.tensorboard
模块支持以下功能:
- 训练指标监控:损失、准确率等标量数据曲线
- 模型结构可视化:计算图与网络层次结构
- 特征图/卷积核可视化:激活与权重的空间分布
- 梯度分布分析:参数更新动态
- 嵌入向量投影:高维数据的低维可视化
2. 安装与启动
- 安装:
pip install tensorboard
- 启动:
tensorboard --logdir=./runs # 指定日志目录
二、关键可视化场景实现
1. 记录标量数据(训练曲线)
- 实现步骤:
from torch.utils.tensorboard import SummaryWriter writer = SummaryWriter('./runs/exp1') # 创建Writer对象 for epoch in range(100): train_loss = ... # 计算训练损失 val_acc = ... # 计算验证准确率 writer.add_scalar('Loss/train', train_loss, epoch) writer.add_scalar('Accuracy/val', val_acc, epoch) writer.close() # 关闭Writer
- 面板查看:SCALARS选项卡下对比训练损失与验证准确率曲线。
2. 可视化模型结构
- 记录计算图:
model = ... # 定义模型 dummy_input = torch.randn(1, 3, 224, 224) # 与输入尺寸匹配 writer.add_graph(model, dummy_input)
- 面板查看:GRAPHS选项卡下查看模型计算图与层级结构。
3. 特征图与卷积核可视化
- 特征图可视化:
# 获取某层的输出(参考前篇钩子方法) features = activation[0] # 形状: [channels, H, W] writer.add_images('FeatureMaps', features.unsqueeze(1), epoch) # 添加通道维度
- 卷积核可视化:
kernels = model.conv1.weight.detach().cpu() writer.add_images('Conv1/Kernels', kernels, epoch)
4. 梯度分布监控
- 记录梯度直方图:
for name, param in model.named_parameters(): if param.grad is not None: writer.add_histogram(f'Gradients/{name}', param.grad, epoch)
5. 嵌入向量投影
- 记录高维数据:
embeddings = ... # 提取的特征向量(如全连接层前) labels = ... # 对应标签 writer.add_embedding(embeddings, metadata=labels, tag='Embeddings')
三、高级功能与技巧
1. 超参数调优可视化(HPARAMS)
- 记录超参数组合:
from torch.utils.tensorboard.summary import hparams hparams_dict = {'lr': 0.01, 'batch_size': 32} metric_dict = {'Accuracy': 0.95, 'Loss': 0.2} writer.add_hparams(hparams_dict, metric_dict)
2. 图像/视频/音频记录
- 图像样本可视化:
images = ... # 输入批次图像(形状[N,C,H,W]) writer.add_images('TrainingSamples', images, epoch)
3. 多实验对比
- 创建多个Writer实例:
writer1 = SummaryWriter('./runs/exp1_lr0.01') writer2 = SummaryWriter('./runs/exp2_lr0.001')
- 面板对比:TensorBoard自动合并不同实验日志,通过筛选查看对比。
四、注意事项与调试
-
日志目录管理:
- 不同实验使用不同子目录(如
./runs/exp1
,./runs/exp2
) - 定期清理旧日志避免存储浪费
- 不同实验使用不同子目录(如
-
数据频率控制:
- 高频记录(如每batch)可能导致日志文件过大
- 建议按epoch间隔记录关键指标
-
版本兼容性:
- PyTorch 1.8+推荐使用
add_graph
的新API - 旧版可能需要
torchviz
生成计算图
- PyTorch 1.8+推荐使用
-
常见问题排查:
- 面板无数据:检查日志路径是否匹配
--logdir
参数 - 图像显示异常:确认张量值已归一化到[0,1]或[0,255]
- 端口冲突:使用
--port
指定其他端口(如6007
)
- 面板无数据:检查日志路径是否匹配
四、使用wandb可视化训练过程
一、Wandb简介与核心优势
1. 工具定位
Weights & Biases(Wandb)是专为机器学习研发设计的云端实验管理平台,提供以下核心功能:
- 实验跟踪:记录超参数、训练指标、系统资源
- 可视化分析:实时训练曲线、模型预测结果
- 协作管理:团队共享实验、对比结果、生成报告
- 模型管理:版本控制、注册与部署
- 数据集管理:版本跟踪、数据分布可视化
2. 核心优势(对比TensorBoard)
特性 | Wandb | TensorBoard |
---|---|---|
部署方式 | 云端(支持离线同步) | 本地 |
协作能力 | 多用户实时共享 | 单机查看 |
实验对比 | 跨运行自动对比 | 需手动管理日志目录 |
报告生成 | 内置Markdown/图表报告生成 | 无原生支持 |
超参数优化 | 集成Sweeps工具 | 需外部工具 |
数据版本控制 | 数据集/模型版本跟踪 | 无内置支持 |
二、快速上手配置
1. 安装与初始化
- 安装库:
pip install wandb
- 账号登录:
wandb login # 按提示输入API密钥
- 初始化项目(代码内):
import wandb wandb.init(project="my_project", # 项目名称 config=config_dict, # 超参数字典 name="exp1") # 实验名称
2. 基本配置参数
参数名 | 说明 | 示例值 |
---|---|---|
project |
项目名称(云端创建或复用) | “mnist-classifier” |
entity |
团队账户名称(默认个人账户) | “datawhale-team” |
config |
超参数字典 | {"lr": 0.01, "batch_size": 64} |
tags |
实验标签(便于搜索过滤) | ["resnet", "augmentation"] |
三、核心功能实战
1. 训练指标跟踪
- 记录标量指标:
for epoch in range(epochs): train_loss = ... val_acc = ... wandb.log({"train_loss": train_loss, "val_acc": val_acc}, step=epoch) # 指定步长
- 记录系统资源:
wandb.log({"GPU Memory": torch.cuda.max_memory_allocated()})
2. 模型与数据管理
- 保存模型检查点:
torch.save(model.state_dict(), "model.pth") wandb.save("model.pth") # 上传到云端
- 记录数据集版本:
dataset = wandb.Artifact("mnist", type="dataset") dataset.add_dir("data/processed") wandb.log_artifact(dataset)
3. 可视化高级功能
- 媒体数据记录:
# 记录预测图像示例 images = ... # 形状[N,C,H,W] captions = ["pred: {}, gt: {}".format(pred, gt) for pred, gt in zip(predictions, labels)] wandb.log({"Predictions": [wandb.Image(img, caption=caption) for img, caption in zip(images, captions)]})
- 自定义可视化面板:
# 在Wandb网页端拖拽生成自定义Dashboard # 支持折线图、混淆矩阵、3D点云等
更多推荐
所有评论(0)