我有一个模型文件,看起来像这样
OrderedDict([('inp.conv1.conv.weight',
(0 ,0 ,0 ,.,.) =
-1.5073e-01 6.4760e-02 1.9156e-01
1.2175e-01 3.5886e-02 1.3992e-01
-1.5903e-01 8.2055e-02 1.7820e-01
(0 ,0 ,1 ,.,.) =
1.0604e-01 -1.3653e-01 1.4803e-01
6.0276e-02 -1.4674e-02 2.3059e-06
-6.2192e-02 -5.1061e-03 -7.4145e-03
(0 ,0 ,2 ,.,.) =
-5.5632e-02 3.5326e-02 6.5108e-02
1.1411e-01 -4.4160e-02 8.2610e-02
8.9979e-02 -3.5454e-02 4.2549e-02
(1 ,0 ,0 ,.,.) =
4.8523e-02 -4.3961e-02 5.3614e-02
-1.2644e-01 1.2777e-01 8.9547e-02
3.8392e-02 2.7016e-02 -1.4552e-01
(1 ,0 ,1 ,.,.) =
9.5537e-02 2.8748e-02 3.9772e-02
-6.2410e-02 1.1264e-01 7.8663e-02
-2.6374e-02 1.4401e-01 -1.7109e-01
(1 ,0 ,2 ,.,.) =
5.1791e-02 -1.6388e-01 -1.7605e-01 …Run Code Online (Sandbox Code Playgroud) 我正在使用基于 Resnet152 的迁移学习来训练模型。基于 PyTorch 教程,我在保存经过训练的模型并加载它进行推理方面没有问题。但是,加载模型所需的时间很慢。我不知道我做对了没有,这是我的代码:
将训练好的模型保存为状态字典:
torch.save(model.state_dict(), 'model.pkl')
Run Code Online (Sandbox Code Playgroud)
加载它以进行推理:
model = models.resnet152()
num_ftrs = model.fc.in_features
model.fc = nn.Linear(num_ftrs, len(classes))
st = torch.load('model.pkl', map_location='cuda:0' if torch.cuda.is_available() else 'cpu')
model.load_state_dict(st)
model.eval()
Run Code Online (Sandbox Code Playgroud)
我对代码进行了计时,发现第一行model = models.resnet152()加载时间最长。在 CPU 上,测试一张图像需要 10 秒。所以我的想法是这可能不是加载它的正确方法?
如果我像这样保存整个模型而不是 state.dict:
torch.save(model, 'model_entire.pkl')
Run Code Online (Sandbox Code Playgroud)
并像这样测试它:
model = torch.load('model_entire.pkl')
model.eval()
Run Code Online (Sandbox Code Playgroud)
在同一台机器上,测试一张图像只需 5 秒。
所以我的问题是:这是加载 state_dict 进行推理的正确方法吗?
我正在尝试在烧瓶应用程序中提供 pytorch 模型。当我早些时候在 jupyter 笔记本上运行此代码时,此代码正在运行,但现在我在虚拟环境中运行它,显然即使类定义就在那里,它也无法获得属性“Net”。所有其他类似的问题都告诉我在同一个脚本中添加保存模型的类定义。但它仍然不起作用。火炬版本是 1.0.1(保存的模型和 virtualenv 都在其中进行了训练)我做错了什么?这是我的代码。
import os
import numpy as np
from flask import Flask, request, jsonify
import requests
import torch
from torch import nn
from torch.nn import functional as F
MODEL_URL = 'https://storage.googleapis.com/judy-pytorch-model/classifier.pt'
r = requests.get(MODEL_URL)
file = open("model.pth", "wb")
file.write(r.content)
file.close()
class Net(nn.Module):
def __init__(self):
super(Net, self).__init__()
self.fc1 = nn.Linear(input_size, hidden_size)
self.fc2 = nn.Linear(hidden_size, hidden_size)
self.fc3 = nn.Linear(hidden_size, output_size)
def forward(self, x):
x = torch.sigmoid(self.fc1(x))
x = torch.sigmoid(self.fc2(x))
x = self.fc3(x)
return F.log_softmax(x, dim=-1)
model …Run Code Online (Sandbox Code Playgroud) 我想保存最好的模型,然后在测试期间加载它。所以我使用了以下方法:
def train():
#training steps …
if acc > best_acc:
best_state = model.state_dict()
best_acc = acc
return best_state
Run Code Online (Sandbox Code Playgroud)
然后,在我使用的主函数中:
model.load_state_dict(best_state)
Run Code Online (Sandbox Code Playgroud)
恢复模型。
但是,我发现 best_state 总是与训练时的最后一个状态相同,而不是最佳状态。有谁知道原因以及如何避免它?
顺便说一下,我知道我可以使用torch.save(the_model.state_dict(), PATH)然后通过
the_model.load_state_dict(torch.load(PATH)). 但是,我不想将参数保存到文件中,因为训练和测试函数在一个文件中。
我正在 pytorch 中训练一个模型,我为此创建了一个类,如下所示:
from torch import nn
class myNN(nn.Module):
def __init__(self, dense1=128, dense2=64, dense3=32, ...):
self.MLP = nn.Sequential(
nn.Linear(dense1, dense2),
nn.ReLU(),
nn.Linear(dense2, dense3),
nn.ReLU(),
nn.Linear(dense3, 1)
)
...
Run Code Online (Sandbox Code Playgroud)
为了保存它,我正在使用:
torch.save(model.state_dict(), checkpoint_model_path)
Run Code Online (Sandbox Code Playgroud)
并加载它我正在使用:
model = myNN() # or with specified parameters
model.load_state_dict(torch.load(model_file))
Run Code Online (Sandbox Code Playgroud)
但是,为了使此方法起作用,我必须在 myNN() 的构造函数中使用正确的值。这意味着我需要以某种方式记住或存储我在每种情况下使用的参数(层大小),以便正确加载不同的模型。
有没有一种灵活的方法可以在 pytorch 中保存/加载模型,我还可以读取层的大小?
例如,通过直接加载 myNN() 对象或以某种方式从保存的 pickle 文件中读取层大小?
我犹豫是否要尝试在 PyTorch 中保存训练模型的最佳方式中的第二种方法?由于那里提到的警告。有更好的方法来实现我想要的吗?