一、可视化网络结构

一、为什么需要可视化网络结构?

  1. 模型调试:帮助发现网络层的连接错误
  2. 参数统计:直观查看参数量与计算量
  3. 结构优化:辅助设计更高效的网络架构
  4. 学术交流:论文与报告中直观展示模型结构

二、常用可视化工具及方法

方法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(模型结构查看器)

特点:支持多种格式的模型可视化

使用方式

  1. 在线使用:访问 Netron
  2. 本地安装:支持Windows/Mac/Linux
  3. 支持的格式:
    • PyTorch (.pt, .pth)
    • ONNX (.onnx)
    • TensorFlow (.pb)
    • Keras (.h5)

操作流程

# 保存PyTorch模型
torch.save(model, 'model.pth')
# 使用Netron打开保存的模型文件

界面特点

  • 分层显示网络结构
  • 点击节点查看详细参数
  • 支持缩放和布局调整

三、工具对比与选择建议

工具 可视化形式 交互性 安装复杂度 适用场景
torchsummary 文本摘要 简单 快速查看参数统计
torchviz 计算图 中等 理解数据流向,调试计算图
Netron 结构图 简单 直观查看整体架构,支持多种格式

选择建议

  1. 快速参数统计 → torchsummary
  2. 调试计算图 → torchviz
  3. 分享与展示 → Netron
  4. 多框架支持 → 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自动合并不同实验日志,通过筛选查看对比。

四、注意事项与调试

  1. 日志目录管理

    • 不同实验使用不同子目录(如./runs/exp1./runs/exp2
    • 定期清理旧日志避免存储浪费
  2. 数据频率控制

    • 高频记录(如每batch)可能导致日志文件过大
    • 建议按epoch间隔记录关键指标
  3. 版本兼容性

    • PyTorch 1.8+推荐使用add_graph的新API
    • 旧版可能需要torchviz生成计算图
  4. 常见问题排查

    • 面板无数据:检查日志路径是否匹配--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点云等
    
Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐