如何利用已经训练好的模型,验证它的结果,步骤如下:
步骤一:加载测试输入并更改为合适尺寸
- 保存图片到指定文件夹下,注意是否为同级目录
- 注意:返回上一级目录为“…/xxx"
- 有时,我们自己的输入数据的尺寸不满足模型的输入尺寸,可以使用Resize() 进行变换
- 如果为png格式的图片,则它除了RGB三通道外,还有一个透明度通道,需要使用convert(),来去除透明度通道
- 代码如下:
import torch
from PIL import Image
from torchvision import transforms
image_path = 'images/dog.png'
image = Image.open(image_path)
print(image) # <PIL.PngImagePlugin.PngImageFile image mode=RGBA size=216x157 at 0x22375C91010>
# 由于该png图片为RGBA四通道和216*157,需要将它转换为RGB三通道和32*32
image = image.convert('RGB')
# 使用compose函数将多个transforms组合在一起
transform = transforms.Compose([transforms.Resize((32, 32)), transforms.ToTensor()])
image = transform(image)
print(image.size()) # torch.Size([3, 32, 32])
步骤二:加载训练好的模型
- 使用torch.load() 加载训练好的模型
- 由于训练模型使用的是GPU,所以在输入数据时需要将数据转换为GPU的格式
- 由于训练模型时的数据为4维,且第一维度为batch_size,所以需要使用reshape()将输入图片数据转换为4维
- 代码如下:
tudui = torch.load('pth/module29.pth')
# 由于训练模型使用的是GPU,所以在输入数据时需要将数据转换为GPU的格式
image = image.cuda()
# 由于训练模型时的数据为4维,且第一维度为batch_size,所以需要将输入数据转换为4维
image = torch.reshape(image, (1, 3, 32, 32))
步骤三:开始测试
- 将模型设置为测试模式
- 使用with torch.no_grad(): 关闭梯度计算,提高计算效率
- 使用argmas(1),让它横向输出概率最高的下标号
- 代码如下:
# 将模型设置为测试模式
tudui.eval()
# 使用torch.no_grad()上下文管理器,关闭梯度计算
with torch.no_grad():
output = tudui(image)
print(output.argmax(1))
# 输出结果:
# <PIL.PngImagePlugin.PngImageFile image mode=RGBA size=130x138 at 0x187D30E17D0>
# torch.Size([3, 32, 32])
# tensor([5], device='cuda:0')
- 模型的各类别下标号如下:
- 输入图片如下:
注意事项
- 当我们在没有GPU的环境中加载使用cuda训练的模型时,需要指定该模型的map_location,代码如下:
tudui = torch.load('pth/module29.pth', map_location='cpu')