常见原因是传入了未实例化的模型类或state_dict(),而非已实例化并调用.to(device)的nn.module对象;input_size需为不含batch维度的tuple,如图像填(3,224,224),多输入或动态结构模型建议改用torchinfo。

torchsummary.summary() 为什么报错说 model is not a Module
常见原因是传入了模型的 state_dict() 或者未实例化的类,而非实际的 nn.Module 对象。比如写成 summary(MyModel, ...)(没加括号)或 summary(model.state_dict(), ...),都会触发 TypeError: model must be a torch.nn.Module。
正确做法是确保传入已实例化、且已调用 .to(device) 的模型对象:
import torch
import torch.nn as nn
from torchsummary import summary
<p>class SimpleNet(nn.Module):
def <strong>init</strong>(self):
super().<strong>init</strong>()
self.conv = nn.Conv2d(3, 16, 3)
self.fc = nn.Linear(16 <em> 30 </em> 30, 10)</p><pre class="brush:python;toolbar:false;">def forward(self, x):
x = self.conv(x)
x = x.view(x.size(0), -1)
return self.fc(x)model = SimpleNet().to('cuda') # 必须实例化 + 指定设备 summary(model, input_size=(3, 32, 32)) # input_size 是 tuple,不是 batch 维度
input_size 参数到底怎么填,为什么总报错
input_size 是指单个样本的 shape,不含 batch 维度 —— 这是最常踩的坑。例如图像输入是 (B, 3, 224, 224),这里要填 (3, 224, 224);如果是文本 embedding 输入 (B, T, D),就填 (T, D)(注意顺序,torchsummary 默认按 (C, H, W) 或 (L, D) 解析)。
- 必须是 tuple,不能是 list 或 torch.Size
- 如果模型有多个输入(如多模态),
torchsummary原生不支持,得换torchinfo - CPU 模型可直接用
input_size;GPU 模型必须先.to('cuda'),否则会因设备不匹配报错
为什么 total params 显示为 0 或远小于预期
通常是因为模型里用了动态结构,比如条件分支中某些层在前向时未被调用(如 if training: 下的 dropout 层未生效)、或使用了未注册的参数(比如手动创建的 nn.Parameter 但没加到 self 下)。
另一个典型情况:模型含 torch.jit.script 或 DataParallel 包装。前者会让 torchsummary 无法遍历子模块;后者则可能把参数分散到 module.conv 而非 conv,导致统计遗漏。
- 检查是否误用了
nn.DataParallel:改用torch.nn.parallel.DistributedDataParallel或直接删掉包装再 summary - 确认所有可学习参数都通过
self.xxx = nn.Linear(...)方式定义,而非self.weight = nn.Parameter(...)后忘记self.register_parameter - 临时加一句
print(list(model.named_parameters()))对比参数名和summary输出,快速定位缺失层
替代方案:torchinfo 更可靠吗
是的。torchinfo(原 torchsummaryX)修复了多数 torchsummary 的限制:支持多输入、显示每层内存占用、兼容 JIT 和部分封装模型,API 也更一致。
安装与基本用法:
pip install torchinfo from torchinfo import summary <p>summary(model, input_size=(1, 3, 224, 224)) # 这里可以带 batch 维度了!</p>
它还会标出「Non-trainable parameters」,对冻结 backbone 的场景更实用。不过要注意:若模型 forward 中有 torch.cuda.amp.autocast 或自定义 CUDA kernel,仍可能无法准确推断 shape —— 这种时候就得手动 print param.numel() 累加。
真正难搞的是那些依赖运行时 shape 的模型(比如带 dynamic shape 的 ONNX 导出逻辑),这时候 torchsummary 和 torchinfo 都会失效,只能靠插入 hook 或调试 forward 流程来逐层 inspect。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











