from torchvision.models import resnet34
net=resnet34() # 注意:模型内部传参数和不传参数,输出的结果是不一样的
# 计算网络参数
total = sum([param.nelement() for param in net.parameters()])
# 精确地计算:1MB=1024KB=1048576字节
print('Number of parameter: % .4fM' % (total / 1e6))
输出:
Number of parameter: 21.7977M
torchinfo 的 summary 更加友好,我个人觉得是 print 和 torchsummary 的 summary 的结合体!推荐!!!
from torchvision.models import resnet34
import torch
from torchinfo import summary # 注意:当使用from torchsummary import summary时,对应的summary应该为:summary(model, input_size=(3, 512, 512), batch_size=-1)
if __name__ == "__main__":
model = resnet34()
tmp_0 = model(torch.rand(1, 3, 224, 224).cuda())
print(tmp_0.shape)
summary(model, (1, 3, 224, 224))# summary的函数内部参数形式与导入的第三方库有关,否则报错
torchsummary 中的 summary 可以打印每一层的shape, 参数量,
from torchvision.models import resnet34
from torchsummary import summary
model = resnet34()
summary(model, input_size=(3, 512, 512), batch_size=-1)# 同样是summary函数,注意与方法二的区别
输出结果如下:
注意区分FLOPs和FLOPS
FLOPs就是表示模型前向传播中计算MAC(乘法加法操作的次数),如果FLOPs的值越大,也从一定程度上说明模型越复杂,模型需要的计算力(算力)更高,因此对硬件的要求也就越高!
from torchvision.models import resnet34
import torch
from thop import profile
if __name__ == "__main__":
# #call Transception_res
model = resnet34()
input = torch.randn(1, 3, 512, 512)
Flops, params = profile(model, inputs=(input,)) # macs
print('Flops: % .4fG'%(Flops / 1000000000))# 计算量
print('params参数量: % .4fM'% (params / 1000000)) #参数量:等价与上面的summary输出的Total params值
该网络模型中包含该方法的计算:https://github.com/Barrett-python/DuAT/blob/main/DuAT.py
输出结果:输出为网络模型的总参数量(单位M,即百万)与计算量(单位G,即十亿)
Flops: 19.2174G
params参数量: 21.7977M