1. 课程学习
本节课主要对于大白AI课程:https://mp.weixin.qq.com/s/STbdSoI7xLeHrNyLlw9GOg
《Pytorch 模型推理及多任务通用范式》课程中的第二节课进行学习。
本课程的重点有:
- 将分类任务进行拆解为三部分进行介绍:数据预处理、模型预测、数据后处理。
- 预测时的数据预处理,要向训练时的预处理方式对齐
- 模型预测,主要是载入模型以及加载 训练好的模型权重
- 预测时的数据后处理,要向模型的head结构和loss设计对齐。
- 以mobilenet-v2为例,介绍了该网络中每层架构
2. 作业题目
2.1必做题:
(1) 把模型改为 resnet18,加载相应的模型权重(Lesson2 的物料包中有),跑一下 0.jpg 和 1.jpg,看一下输出结果。官方 torchvision 训练 mobilenet 和训练 resnet 的方式是一样 的,所以数据预处理和数据后处理部分完全相同。
结果:

mobilenet的预测结果为:(‘umbrella’, 0.9998866319656372);(‘peacock’, 0.9999724626541138)
resnet18的预测结果为:(‘umbrella’, 0.9995712637901306);(‘peacock’, 0.9999839067459106)
(2) 自己找 2 张其他图,用 resnet18 做下推理。
思考题: 

mobilenet的预测结果为:(‘tusker’, 0.5399301648139954);(‘folding chair’, 0.9994507431983948)
resnet18的预测结果为:(‘tusker’, 0.41636401414871216)
;(‘folding chair’, 0.9999761581420898)
从当前几张照片的越结果来看,mobilenet的效果会稍微好一些。
2.2 思考题
(1) 以 ResNet18 为例,用 time 模块和 for 循环,对”./images/0.jpg”连续推理 100 次,统计时间开销。
回答:【没有GPU,所以只做了基于CPU的推理】
1次为:0.1650102138519287
10次为:1.6096162796020508
100次为:14.75416088104248
1000次为:136.48899126052856
同一个模型,对同一张图像的推理速度存在差异。推理实现代码如下:
image = cv2.imread("./images/0.jpg")t_all = 0for i in range(10):t_start = time.time()result = model_classify.predict(image) # 推理t_end = time.time()t_all += t_end - t_start # 将每次的推理时间累加到变量 t_all 中print(t_all)
(2) 在数据预处理和数据后处理的代码实现中,到处在用 numpy, opencv, torch 对数组做 相应变换,大家至少要把课程中出现的函数们给理解。
numpy:
- np.array(list) # 函数可以将list转为array数组
- inputs[np.newaxis,:,:,:] # 用法可以在inputs变量的指定位置(这里是最外层)增加一个维度;inputs[:,:,:,np.newaxis] # 是在inputs变量中的最里层,即每个元素上加一个维度。(这里描述可能有些小问题)
opencv:
- cv2.cvtColor(image,cv2.COLOR_BGR2RGB) # 颜色转换
- cv2.resize(image, dsize) # 图像resize
- image = cv2.imread(“./images/0.jpg”) # 图像读取,后面还可以通过参数用于指读取图像的模式
- cv2.imwrite(“./images/0.jpg”, img) # 图像保存
torch :
- inputs=torch.ones([1,3,224,224]).type(torch.float32) # 构建一个分量全为浮点型,值为1的,维度为[1,3,224,224]的tensor
- pretrained_state_dict=torch.load(‘./weights/mobilenet_v2-b0353104.pth’) # 指定路径下模型权重的载入
- model.to(torch.device(‘cpu’)) # 指定device为CPU,且将模型放在CPU上。
- torch.onnx.export(model, inputs, ‘./weights/mobilenet_v2.onnx’, verbose=False) # 生成onnx文件。其参数分别为:需要转化的model,输入的数据?,onnx模型保存位置与名称,不需要输出日志信息。
inputs=torch.from_numpy(inputs) #NumpyArray ——> Tensor- 这里的inputs有什么作用?
- outputs=torch.softmax(outputs,dim=1)
score, label_id = torch.max(outputs, dim=1)
3.学习心得
虽然代码跑通了,也能触类旁通的换成其他网络、学习一些函数的用法等。但是还是不太清楚如何更好的了解学习不同网络本身的结构特点。除了看论文,老师还有什么其他好的建议吗?
- 用神经网络做推理,是要解决“从非结构化/半结构化数据中提取有效的结构化信息”的问题
4.其他(潘大强老师第二节课的作业批改和点评)
- 小部分同学,在复习过程中,切切实实做到了去挖掘问题难点,并尝试上网搜索解决我整理了2个和课程直接相关的问题,放在了问题收集页 https://docs.qq.com/doc/DWGh0c2NCQmNNU0tk](https://docs.qq.com/doc/DWGh0c2NCQmNNU0tk](https://docs.qq.com/doc/DWGh0c2NCQmNNU0tk ,里边的Lesson2 Q5 和Q6,感兴趣的同学可以去瞅瞅。
- 最后,分享其中一位同学的答案:https://zhuanlan.zhihu.com/p/421578754 他把“model.state_dict()、model.named_paameters()和model.parameters()三者的不同点”这个问题,回答地很细节很具体。
