DAY 35 模型可视化与推理-2025.9.30
模型可视化与推理
知识点回顾:
- 三种不同的模型可视化方法:推荐torchinfo打印summary+权重分布可视化
- 进度条功能:手动和自动写法,让打印结果更加美观
- 推理的写法:评估模式
笔记:
一、三种模型可视化方法
1. torchinfo 打印模型结构
torchinfo
是专门用于打印模型结构的工具,能清晰展示各层名称、输入输出形状、参数数量等信息,适合快速了解模型整体结构。
安装:
pip install torchinfo
import torch
import torch.nn as nn
from torchinfo import summary# 定义一个简单模型(示例)
class SimpleModel(nn.Module):def __init__(self):super().__init__()self.conv1 = nn.Conv2d(3, 16, kernel_size=3, stride=1, padding=1)self.bn1 = nn.BatchNorm2d(16)self.fc = nn.Linear(16*32*32, 10) # 假设输入为32x32的图像def forward(self, x):x = self.conv1(x)x = self.bn1(x)x = x.flatten(1)x = self.fc(x)return xmodel = SimpleModel()
# 打印summary(需指定输入尺寸,batch_size可设为-1表示任意)
summary(model, input_size=(1, 3, 32, 32)) # (batch, channel, height, width)
输出说明:会显示每一层的名称、输入输出形状(Input Shape
/Output Shape
)、参数数量(Params
)及总参数量,便于快速校验模型结构是否符合预期。
2. 权重分布可视化
通过绘制权重参数的直方图 / 核密度图,可直观观察参数分布是否合理(如是否过分散 / 过集中),辅助判断模型训练状态。
示例代码:
import matplotlib.pyplot as plt
import seaborn as sns# 提取某层权重(以conv1为例)
weights = model.conv1.weight.data.numpy().flatten() # 展平为一维数组# 绘制直方图
plt.figure(figsize=(10, 4))
sns.histplot(weights, bins=50, kde=True) # kde=True添加核密度曲线
plt.title("Conv1 Layer Weights Distribution")
plt.xlabel("Weight Value")
plt.ylabel("Count")
plt.show()
作用:若权重分布过于集中(如接近 0),可能表示模型训练不足;若分布异常分散,可能存在梯度爆炸风险。
3. 计算图可视化(torchviz)
通过 torchviz
绘制模型的计算图,展示张量的流动路径和操作关系,适合调试复杂模型的前向传播逻辑。
安装:
pip install torchviz
# 需额外安装graphviz(系统工具):https://graphviz.org/download/
from torchviz import make_dot# 生成一个输入张量
x = torch.randn(1, 3, 32, 32)
# 前向传播得到输出
y = model(x)
# 绘制计算图
graph = make_dot(y, params=dict(model.named_parameters()))
graph.render("model_graph", format="png") # 保存为图片
输出:生成的图片会展示从输入到输出的所有操作(如卷积、批归一化、线性层等)及张量形状变化,清晰呈现计算流程。
二、进度条功能实现
1. 手动实现进度条
适用于简单场景,通过控制台输出覆盖实现动态更新。
示例代码:
import timetotal = 100 # 总任务数
for i in range(total + 1):progress = i / total * 100# 用\r覆盖当前行,end=""取消换行print(f"\r进度: [{'#' * int(i/2)} {' ' * (50 - int(i/2))}] {progress:.1f}%", end="")time.sleep(0.05) # 模拟任务耗时
print("\n任务完成!")
说明:通过 \r
回到行首,用 #
填充进度条,动态显示百分比,适合轻量化需求。
2. 自动实现(tqdm
库,推荐)
tqdm
是常用的进度条库,支持自动计算进度、剩余时间预估,兼容循环 / 迭代器。
安装:
pip install tqdm
from tqdm import tqdm
import time# 1. 直接包裹可迭代对象(最简单用法)
total = 100
for i in tqdm(range(total), desc="处理中"): # desc设置进度条名称time.sleep(0.05)# 2. 手动更新进度(适合非迭代场景)
pbar = tqdm(total=total, desc="手动更新")
for i in range(total):time.sleep(0.05)pbar.update(1) # 每次更新1步
pbar.close() # 关闭进度条
优势:自动显示 %
、已完成数 / 总数、耗时、剩余时间,支持自定义名称和单位,美观且易用。
三、推理的评估模式写法
在模型推理 / 评估阶段,需通过 model.eval()
切换为评估模式,并禁用梯度计算以节省内存和加速。
核心要点:
model.eval()
:关闭 Dropout 层、固定 BatchNorm 层的均值 / 方差(使用训练时统计的结果)。
torch.no_grad()
:禁用梯度计算,减少内存占用并加速推理。
示例代码:
import torch
from torch.utils.data import DataLoader, TensorDataset# 假设已定义模型和测试数据集
model = SimpleModel()
test_data = TensorDataset(torch.randn(100, 3, 32, 32), torch.randint(0, 10, (100,)))
test_loader = DataLoader(test_data, batch_size=16)# 加载训练好的权重(示例)
model.load_state_dict(torch.load("model_weights.pth"))# 切换到评估模式
model.eval()
total_correct = 0
total_samples = 0# 禁用梯度计算
with torch.no_grad():for inputs, labels in tqdm(test_loader, desc="评估中"):outputs = model(inputs) # 前向传播_, preds = torch.max(outputs, 1) # 取预测概率最大的类别total_correct += (preds == labels).sum().item()total_samples += labels.size(0)# 计算准确率
acc = total_correct / total_samples
print(f"测试准确率: {acc:.4f}")
说明:评估模式确保推理结果的一致性(避免 Dropout 随机失活和 BatchNorm 动态更新),torch.no_grad()
可使推理速度提升约 20%-50%。