- 1、学习内容:
- 2、必做题:
- (1)代码和运算结果截屏
- (2)ONNX文件大小
- 3、思考题
- (1)规律
- (2)onnx残差结构截图
- (3)不同点的比较
- (4)模型加载中strict的参数意义:
1.如何载入、加载模型、
2.计算模型的参数量
代码:
为了避免代码重复,没有贴上输入尺寸为448x448的代码,修改位置见注释
import torchvision.models as models
import torch
from thop import profile
model = models.resnet18()#加载模型
pretrained_state_dict = torch.load('./models/weights/resnet18-5c106cde.pth')#加载权重
model.load_state_dict(pretrained_state_dict,strict=True)#载入权重
model_state_dict = model.state_dict()
input = torch.rand([1,3,224,224]).type(torch.float32) # 将长宽修改成448,448
flops,params = profile(model=model,inputs=(input,))
print('model:{:.2f} GFLOPS and {:.2f}M parameters'.format(flops/1e9,params/1e6))#模型参数量
结果:
224 x 224 :
448 x 448:
原resnet18权重文件大小为44.6M,当转为onnx时为44.5M,大小变化不大。但在yolov5中,将训练好的权重文件转为onnx时,大小减少将近一半,这是有点疑惑的。
3、思考题 (1)规律当把输入尺寸为(1,3,224,224)改为(1,3,448,448)时,模型的参数量成倍增加,增加将近4倍,即输入尺寸的倍数(2x2);
(2)onnx残差结构截图(3)不同点的比较onnx中的一段残差结构
model.state_dict(), model.named_parameters()和 model.parameters()
- 这三者其中 model.state_dict()是一个字典对象,将每一层与它的对应参数建立映射关系。只有那些参 数可以训练的layer才会被保存到模型的state_dict中,如卷积层,线性层等等,像池化层、BN层这些本身没有参数的层是没有在这个字典中的,更多是在模型保存时使用。
- model.parameters()方法返回的是一个生成器generator,每一个元素是从开头到结尾的参数,parameters没有对应的key名称,是一个由纯参数组成的generator,而state_dict是一个字典,包含了一个key。
- model.named_parameters,而model.parameters正是通过named_parameters来实现的。
当模型中有权重文件不存在参数时,此时字典的key-value对应不上,会报错。将strict设为Flase时,就会有模型中存在的所有参数。



