一、模型结构可视化
理解模型的两大关键:损失函数如何定义任务 ,以及层设计如何决定参数总量。
1. nn.Module 自带方法
- 打印模型结构 :
print(model)直接输出各层名称与顺序。 - 查看参数详情 :
model.named_parameters()可遍历所有可训练参数,获取名称、形状(param.shape)。 - 权重分布分析 :提取
weight参数并转为 numpy 数组,绘制直方图观察各层权重的均值、标准差、最值等统计量。这些信息可辅助调整学习率、初始化方法或正则化强度。
2. torchsummary 库的 summary
- 安装:
pip install torchsummary - 用法:
summary(model, input_size=(4,)) - 必须提供
input_size(不含批量维度),因为 PyTorch 是动态图,需通过虚拟输入前向传播一次来推断各层的输出形状和参数量。 input_size格式取决于模型类型:MLP 用(特征数,),CNN 用(通道, 高, 宽),RNN 用(序列长度, 特征数)。- 报告中参数量的计算:如
Linear(4,10)有 4×10 个权重 + 10 个偏置 = 50 个参数;Linear(10,3)有 10×3+3=33,总参数量 83。
3. torchinfo 库的 summary
- 提供比
torchsummary更详细的摘要,包括每层输入/输出形状、参数量、计算量等,常与 TensorBoard 配合使用。 - 用法相同:
summary(model, input_size=(4,))
二、进度条功能(tqdm)
tqdm 用于在循环中可视化训练进度。
1. 手动更新
python
from tqdm import tqdm
with tqdm(total=10, desc="训练进度", unit="epoch") as pbar:
for i in range(10):
# 训练代码...
pbar.update(1) # 手动前进1步
pbar.set_postfix({'Loss': f'{loss:.4f}'}) # 显示实时指标
desc:左侧描述文字;unit:进度单位(如epoch、batch)。set_postfix可在右侧动态显示字典形式的附加信息。
2. 自动更新
python
for i in tqdm(range(10), desc="处理任务", unit="个"):
# 循环体,无需手动update
直接将可迭代对象传入 tqdm(),自动完成进度更新。
在训练代码中的应用:创建总步数为 num_epochs 的进度条,每完成一定轮次后调用 pbar.update(n) 并刷新 postfix 显示损失值,最终确保进度条到达 100%。
三、模型推理(评估)
训练完成后在测试集上评估模型性能。
关键步骤
-
评估模式 :
model.eval()固定 Dropout、BatchNorm 等训练特定层,保证输出稳定。- 注意:此模式不自动关闭梯度计算,仍需手动处理。
-
禁用梯度 :
with torch.no_grad():避免构建计算图,节省显存并加速推理。 -
预测与准确率 :
pythonoutputs = model(X_test) _, predicted = torch.max(outputs, 1) # 取每行最大值的索引作为类别 correct = (predicted == y_test).sum().item() # 正确个数 accuracy = correct / y_test.size(0) # 准确率torch.max(outputs, dim=1)返回最大值和索引,_忽略最大值,仅获取预测类别。- 所有操作在 GPU 张量上完成,无需转换到 CPU 或使用 sklearn,以保持高效。
知识串联
- 训练阶段:定义损失(
CrossEntropyLoss)与优化器(SGD),在循环中进行前向、反向和参数更新。 - 推理阶段:模型参数固定,仅需前向传播,通过
eval()+no_grad()确保高效、稳定的输出。