PyTorch Model Storage and Use
PyTorch模型保存与使用
将训练好的模型保存下来,这样在需要的时候就可以直接调用。
模型的保存
保存模型有两种方法,一种是保存模型的参数,再次加载时需要原有模型的信息。 另一种是保存模型的所有信息,可以直接加载为原有模型。需要注意的是,如果原有模型是在GPU上训练的,那么在加载到只有CPU 的电脑上时,需要在 torch.load() 时,加上 map_location=torch.device(‘cpu’) 参数变换模型参数到CPU 上。
- 保存模型的所有参数
#保存
torch.save(model, PATH)
#读取
use_model = torch.load(PATH)
- 仅保存模型的参数
#保存
torch.save(CNN.state_dict(), 'CNN.pt')
#读取
new_model = CNN()
new_model.load_state_dict(torch.load('CNN.pt'))
模型的使用
- 先看一下网络结构,使用 MNIST 数据集进行训练。并使用 torch.save(CNN.state_dict(), ‘CNN.pt’) 保存网络信息。
from torch import nn
class CNN(nn.Module):
def __init__(self):
super(CNN, self).__init__()
self.layer1 = nn.Sequential(
nn.Conv2d(1, 16, kernel_size=3),
nn.BatchNorm2d(16),
nn.ReLU(inplace=True))
self.layer2 = nn.Sequential(
nn.Conv2d(16, 32, kernel_size=3),
nn.BatchNorm2d(32),
nn.ReLU(inplace=True),
nn.MaxPool2d(kernel_size=2, stride=2))
self.layer3 = nn.Sequential(
nn.Conv2d(32, 64, kernel_size=3),
nn.BatchNorm2d(64),
nn.ReLU(inplace=True))
self.layer4 = nn.Sequential(
nn.Conv2d(64, 128, kernel_size=3),
nn.BatchNorm2d(128),
nn.ReLU(inplace=True),
nn.MaxPool2d(kernel_size=2, stride=2))
self.fc = nn.Sequential(
nn.Linear(128 * 4 * 4, 1024),
nn.ReLU(inplace=True),
nn.Linear(1024, 128),
nn.ReLU(inplace=True),
nn.Linear(128, 10))
def forward(self, x):
x = self.layer1(x)
x = self.layer2(x)
x = self.layer3(x)
x = self.layer4(x)
x = x.view(x.size(0), -1)
x = self.fc(x)
return x
- 使用训练好的网络。
在使用图片测试网络时,要先将读取的图片转换为 Tensor,之后根据网络的输入结构变换输入。 测试的CNN 网络训练时输入为 [128,1,28,28] 的 Tensor。其中128为 batch_size, 1为图像的厚度,表示图片是灰度图。[28,28] 是图片的长和宽。在用单张图片测试网络的时候,需要把图片的张量换为四维的,可以通过 unsqueeze() 函数在前面扩充一维。之后就可以直接输入到网络,并获取预测结果。
newModel = CNN()
newModel.load_state_dict(torch.load('CNN.pt'))
img = Image.open('./0-label-7.png')
turn = transforms.ToTensor()
img = turn(img)
img = torch.unsqueeze(img, 0)
out = newModel(img)
_, pred = torch.max(out, 1)
print(pred)