2026/1/17 0:38:11
网站建设
项目流程
有好看图片的软件网站模板,微信小程序营销推广,如何运营一个品牌的推广,百度seo排名优化费用浙大疏锦行
一、nn.Module 核心自带方法
nn.Module 封装了模型的核心逻辑#xff0c;以下是高频使用的自带方法#xff0c;按功能分类#xff1a;
1. 模型状态控制#xff08;训练 / 评估模式#xff09;
方法作用model.train()切换为训练模式#xff1a;启用 Dropou…浙大疏锦行一、nn.Module核心自带方法nn.Module封装了模型的核心逻辑以下是高频使用的自带方法按功能分类1. 模型状态控制训练 / 评估模式方法作用model.train()切换为训练模式启用 Dropout、BatchNorm 等层的训练行为默认模式model.eval()切换为评估模式关闭 Dropout、固定 BatchNorm 均值 / 方差用于推理 / 验证model.training属性返回布尔值True 训练模式False 评估模式示例import torch import torch.nn as nn class SimpleCNN(nn.Module): def __init__(self): super().__init__() self.conv nn.Conv2d(3, 16, 3) self.dropout nn.Dropout(0.5) # 训练时随机失活评估时关闭 def forward(self, x): x self.conv(x) x self.dropout(x) return x model SimpleCNN() print(model.training) # True默认训练模式 model.eval() print(model.training) # False评估模式dropout失效 model.train() print(model.training) # True切回训练模式2. 设备迁移CPU/GPU方法作用model.to(device)将模型所有参数 / 缓冲区移到指定设备cuda/cpu/mps返回模型实例model.cuda()快捷方式移到默认 GPU等价于model.to(cuda)model.cpu()快捷方式移到 CPU等价于model.to(cpu)示例device torch.device(cuda if torch.cuda.is_available() else cpu) model model.to(device) # 模型移到GPU/CPU # 验证设备 print(next(model.parameters()).device) # 输出cuda:0 或 cpu3. 参数管理查看 / 遍历参数方法作用model.parameters()返回生成器包含所有可训练参数nn.Parameter类型model.named_parameters()返回生成器(参数名参数张量)便于定位参数model.named_parameters()返回生成器(参数名参数张量)便于定位参数model.state_dict()返回字典{参数名参数值}用于保存模型参数model.load_state_dict()加载参数字典用于恢复模型示例# 查看所有参数名称和形状 for name, param in model.named_parameters(): print(f参数名{name}形状{param.shape}设备{param.device}) # 统计总参数量手动实现无第三方库时用 total_params sum(p.numel() for p in model.parameters()) trainable_params sum(p.numel() for p in model.parameters() if p.requires_grad) print(f总参数{total_params}可训练参数{trainable_params})4. 结构遍历查看模型层方法作用model.children()返回生成器仅包含直接子层如 Sequential 内的第一层不递归model.named_children()返回生成器(层名子层)仅直接子层model.modules()返回生成器递归包含所有层包括嵌套层model.named_modules()返回生成器(层名层)递归所有层示例# 定义嵌套模型 class NestedModel(nn.Module): def __init__(self): super().__init__() self.block1 nn.Sequential( nn.Conv2d(3, 16, 3), nn.ReLU() ) self.block2 nn.Linear(16*30*30, 10) model NestedModel() # children()仅直接子层block1、block2 print( children() ) for name, layer in model.named_children(): print(name, layer) # modules()递归所有层包括Sequential内的Conv2d、ReLU print(\n modules() ) for name, layer in model.named_modules(): print(name, layer)5. 前向传播与梯度方法作用model.forward(x)手动调用前向传播不推荐建议直接model(x)调用__call__model(x)等价于model.__call__(x)自动执行 forward 钩子hook逻辑model.zero_grad()清空所有参数的梯度训练时反向传播前必须调用示例x torch.randn(1, 3, 32, 32).to(device) output model(x) # 推荐调用__call__等价于model.forward(x) 钩子 model.zero_grad() # 清空梯度 output.sum().backward() # 反向传播计算梯度二、torchsummary库的summary方法torchsummary是早期轻量库核心功能是快速打印模型层结构、输出形状、总参数量仅支持单输入模型对嵌套模型 / 多输入支持差维护较少。1. 安装与基本用法pip install torchsummaryfrom torchsummary import summary # 定义模型输入3通道32×32图像 class SimpleCNN(nn.Module): def __init__(self): super().__init__() self.conv1 nn.Conv2d(3, 16, 3, padding1) self.pool nn.MaxPool2d(2, 2) self.conv2 nn.Conv2d(16, 32, 3, padding1) self.fc1 nn.Linear(32 * 8 * 8, 128) self.fc2 nn.Linear(128, 10) def forward(self, x): x self.pool(nn.functional.relu(self.conv1(x))) x self.pool(nn.functional.relu(self.conv2(x))) x x.view(-1, 32 * 8 * 8) x nn.functional.relu(self.fc1(x)) x self.fc2(x) return x # 设备配置 模型初始化 device torch.device(cuda if torch.cuda.is_available() else cpu) model SimpleCNN().to(device) # 调用summary参数模型输入形状通道,高,宽batch_size可选 summary(model, input_size(3, 32, 32), batch_size1)2. 输出解读---------------------------------------------------------------- Layer (type) Output Shape Param # Conv2d-1 [1, 16, 32, 32] 448 MaxPool2d-2 [1, 16, 16, 16] 0 Conv2d-3 [1, 32, 16, 16] 4,640 MaxPool2d-4 [1, 32, 8, 8] 0 Linear-5 [1, 128] 262,272 Linear-6 [1, 10] 1,290 Total params: 268,650 Trainable params: 268,650 Non-trainable params: 0 ---------------------------------------------------------------- Input size (MB): 0.01 Forward/backward pass size (MB): 0.29 Params size (MB): 1.02 Estimated Total Size (MB): 1.32 ----------------------------------------------------------------3. 优缺点优点缺点极简、无多余依赖仅支持单输入模型输出简洁、易理解对嵌套模型 / 多分支模型支持差快速查看参数量 / 形状无批次维度、无内存占用细分支持 GPU/CPU维护停滞仅兼容 PyTorch 旧版本三、torchinfo库的summary方法推荐torchinfo是torchsummary的升级版原torchsummaryX解决了多输入、嵌套模型、维度展示不清晰的问题功能更全面是当前 PyTorch 模型可视化的首选。1. 安装与基本用法pip install torchinfofrom torchinfo import summary # 复用上面的SimpleCNN模型 device torch.device(cuda if torch.cuda.is_available() else cpu) model SimpleCNN().to(device) # 核心参数model, input_size, batch_dim, device, col_width等 summary( model, input_size(1, 3, 32, 32), # (batch_size, 通道, 高, 宽) batch_dim0, # 批次维度的位置默认0 devicedevice, # 模型设备 col_width20, # 列宽 col_names[input_size, output_size, num_params, trainable], # 显示列 row_settings[var_names] # 显示层变量名 )2. 输出解读 Layer (type (var_name)) Input Shape Output Shape Param # Trainable SimpleCNN (SimpleCNN) [1, 3, 32, 32] [1, 10] -- -- ├─Conv2d (conv1) [1, 3, 32, 32] [1, 16, 32, 32] 448 True ├─MaxPool2d (pool) [1, 16, 32, 32] [1, 16, 16, 16] -- -- ├─Conv2d (conv2) [1, 16, 16, 16] [1, 32, 16, 16] 4,640 True ├─MaxPool2d (pool) [1, 32, 16, 16] [1, 32, 8, 8] -- -- ├─Linear (fc1) [1, 2048] [1, 128] 262,272 True ├─Linear (fc2) [1, 128] [1, 10] 1,290 True Total params: 268,650 Trainable params: 268,650 Non-trainable params: 0 Total mult-adds (M): 2.15 Input size (MB): 0.01 Forward/backward pass size (MB): 0.29 Params size (MB): 1.02 Estimated Total Size (MB): 1.32 四、推理的写法评估模式def evaluate_classification(model, dataloader, device): 分类模型评估计算准确率、F1-score宏平均、混淆矩阵 # 1. 切换到评估模式必须 model.eval() # 2. 初始化指标容器 all_preds [] all_labels [] # 3. 关闭梯度计算加速省显存 with torch.no_grad(): for batch_idx, (x, y) in enumerate(dataloader): # 数据移到设备 x x.to(device, dtypetorch.float32) y y.to(device, dtypetorch.long) # 4. 推理前向传播 outputs model(x) # 输出(batch_size, num_classes) preds torch.argmax(outputs, dim1) # 取概率最大的类别 # 5. 收集预测结果和真实标签转回CPU便于计算指标 all_preds.extend(preds.cpu().numpy()) all_labels.extend(y.cpu().numpy()) # 可选打印进度 if (batch_idx 1) % 10 0: print(fBatch [{batch_idx1}/{len(dataloader)}] 完成) # 6. 计算评估指标 accuracy accuracy_score(all_labels, all_preds) f1_macro f1_score(all_labels, all_preds, averagemacro) # 宏平均F1适合类别均衡 f1_weighted f1_score(all_labels, all_preds, averageweighted) # 加权F1适合类别不均衡 # 7. 打印结果 print(*50) print(f分类模型评估结果) print(f准确率 (Accuracy): {accuracy:.4f}) print(f宏平均F1-score: {f1_macro:.4f}) print(f加权F1-score: {f1_weighted:.4f}) print(*50) return { accuracy: accuracy, f1_macro: f1_macro, f1_weighted: f1_weighted, preds: all_preds, labels: all_labels } # 执行评估 eval_results evaluate_classification(model, test_loader, device)