PyTorch学习Lesson2

必做题:

(1) 从torchvision中加载resnet18模型结构,并载入预训练好的模型权重 ‘resnet18-5c106cde.pth’ (在物料包的weights文件夹中)。

import torch

#从torchvision库中加载模型结构
import torchvision.models as models
model = models.resnet18()
#读取预训练好的模型权重
pretrained_state_dict=torch.load('./weights/resnet18-5c106cde.pth')
#将读取的权重载入model
model.load_state_dict(pretrained_state_dict, strict=True)

(2) 将(1)中加载好权重的resnet18模型,保存成onnx文件。

resnet18.onnx文件大小为45648KB

PyTorch学习Lesson2

(3) 以torch.rand([1,3,224,224]).type(torch.float32)作为输入,求resnet18的模型计算量和参数量。

Model: 1.82 GFLOPs and 11.69M parameters

(4) 以torch.rand([1,3,448,448]).type(torch.float32)作为输入,求resnet18的模型计算量和参数量。

Model: 7.27 GFLOPs and 11.69M parameters

完成源码如下

import torch
'''
(1)    从torchvision中加载resnet18模型结构,并载入预训练好的模型权重 'resnet18-5c106cde.pth'
'''
#从torchvision库中加载模型结构
import torchvision.models as models
model = models.resnet18()
#读取预训练好的模型权重
pretrained_state_dict=torch.load('./weights/resnet18-5c106cde.pth')
#将读取的权重载入model
model.load_state_dict(pretrained_state_dict, strict=True)

'''
(2)    将(1)中加载好权重的resnet18模型,保存成onnx文件。
'''
#模型放置CPU
model.to(torch.device('cpu'))
#模型变为推理状态
model.eval()
#构建一个项目推理时需要的输入大小的单精度Tensor,并且放置模型所在的设备(CPU或CUDA)
inputs=torch.ones([1,3,224,224]).type(torch.float32).to(torch.device('cpu'))
#生成onnx
torch.onnx.export(model, inputs, './weights/resnet18.onnx',  verbose=False)

'''
(3)    以torch.rand([1,3,224,224]).type(torch.float32)作为输入,求resnet18的模型计算量和参数量。
(4)    以torch.rand([1,3,448,448]).type(torch.float32)作为输入,求resnet18的模型计算量和参数量。
'''
#从torchvision库中加载模型结构
import torchvision.models as models
model = models.resnet18()
#构建一个适合模型输入大小的单精度Tensor
inputs=torch.ones([1,3,224,224]).type(torch.float32)
inputs2=torch.ones([1,3,448,448]).type(torch.float32)
#统计计算量和参数量
from thop import profile
flops, params = profile(model=model, inputs=(inputs,))
flops2, params2 = profile(model=model, inputs=(inputs2,))
print('Model: {:.2f} GFLOPs and {:.2f}M parameters'.format(flops/1e9, params/1e6))
print('Model2: {:.2f} GFLOPs and {:.2f}M parameters'.format(flops2/1e9, params2/1e6))

思考题:

(1) 比较必做题中的(3)和(4)的结果,有什么规律?
(2) 尝试用netron可视化resnet18的onnx文件
(3) model作为torch.nn.Module的子类,除了用 model.state_dict()查看网络层外,还可以用model.named_parameters()和model.parameters()。它们三儿有啥不同?
(4) 加载模型权重时用的model.load_state_dict(字典, strict=True),里面的strict参数什么情况下要赋值False?

答题格式如下:

必做题:
题(1)提交代码或者代码图片
题(2)提交onnx文件的大小,即多少MB?
题(3)提交计算量和参数量
题(4)提交计算量和参数量
思考题:
题(1)规律用文字叙述
题(2)把里面某一个残差结构(residual block)截个图
题(3)不同点用文字叙述
题(4)文字叙述

上一篇:Django的models及数据库的增删改查


下一篇:Django中manytomanyField自定义第三张表