1 课程学习
本节课主要对于大白AI课程:https://mp.weixin.qq.com/s/STbdSoI7xLeHrNyLlw9GOg
《Pytorch 模型推理及多任务通用范式》课程中的第三节课进行学习。
2 作业题目
(1) 把模型改为resnet18,加载相应的模型权重(Lesson2的物料包中有),跑一下0.jpg和1.jpg,看一下输出结果。官方torchvision训练mobilenet和训练resnet的方式是一样的,所以数据预处理和数据后处理部分完全相同。
('umbrella', 0.9995712637901306) ('peacock', 0.9999839067459106)
(2) 自己找2张其他图,用resnet18做下推理。
(‘bee’, 0.5264432430267334)
(‘cab’, 0.991939127445221)
(1) 以ResNet18为例,用time模块和for循环,对”./images/0.jpg”连续推理100次,统计时间开销,比如:
model_classify=ModelPipline() import time image=cv2.imread("./images/0.jpg") t_all=0 for i in range(100): t_start=time.time() result=model_classify.predict(image) t_end=time.time() t_all+=t_end-t_start print(t_all)
有CUDA的同学,改下代码:self.device=torch.device(‘cuda’)。用上述相同方法测试时间开销。
cpu: 2.3720483779907227 gpu: 0.560788631439209
(2) 在数据预处理和数据后处理的代码实现中,到处在用numpy, opencv, torch 对数组做相应变换,大家至少要把课程中出现的函数们给理解。
cv2.imread函数 有两个参数,第一个参数是图片路径,第二个参数表示读取图片的形式,有三种:
cv2.IMREAD_COLOR:加载彩色图片,这个是默认参数,可以直接写1。
cv2.IMREAD_GRAYSCALE:以灰度模式加载图片,可以直接写0。
cv2.IMREAD_UNCHANGED:包括alpha,可以直接写-1
大多数backbone model 是在公开数据集上训练的,是RGB图像,所以想用这些预训练的权重,输入必须是3通道图像。如果输入是灰度图,则需要以IMREAD_COLOR读入。
numpy的array与torch的tensor的转换
t = torch.ones(3) print("type(t):", type(t)) print("t:", t) # tensor转array a = t.numpy() print("type(a):", type(a)) print("a:", a) print("-"*10) # 此时两个数组(array与tensor)是共用一个储存空间的,也就是说,一个改变,另一个也会改变 t.add_(1) print("t:", t) print("a:", a) print("-"*10) # 将array转换为tensor import numpy as np tt = torch.from_numpy(a) print("type(tt):", type(tt)) print("tt:", tt) print("-"*10) # 此时两个数组(array与tensor)是共用一个储存空间的,也就是说,一个改变,另一个也会改变 np.add(a, 1, out=a) print("t:", t) print("a:", a) print("tt:", tt) print("-"*10) # 当然还有能在GPU上运算的CUDA tensors if torch.cuda.is_available(): x = torch.randn(1) print("type(x):", type(x)) print("x:", x) device = torch.device("cuda") # a CUDA device object y = torch.ones_like(x, device=device) # directly create a tensor on GPU print("type(y):", type(y)) print("y:", y) x = x.to(device) # or just use strings ``.to("cuda")`` print("cuda type(x):", type(x)) print("cuda x:", x) z = x + y print(z) print("cuda type(z):", type(z)) print("cuda z:", x) print(z.to("cpu", torch.double)) # ``.to`` can also change dtype together!
输出:
参考torch与numpy数组的转换及注意