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数组的转换及注意