モデルクラスをどこかに定義しなくても、PyTorchモデルを保存するにはどうすればよいですか?
免責事項:
でベストな方法PyTorchで訓練されたモデルを保存するには?、モデルクラスコードにアクセスせずにモデルを保存するためのソリューション(または実用的なソリューション)はありません。
利用可能なPytorchライブラリ(つまり、Python、C ++、またはサポートされている他のプラットフォームのPytorch)を使用して推論を行う場合は、TorchScriptを使用するのが最善の方法です。
最も簡単なのはtrace = torch.jit.trace(model, typical_input)
、それからを使用することだと思いますtorch.jit.save(trace, path)
。次に、トレースされたモデルをでロードできますtorch.jit.load(path)
。
これは本当に簡単な例です。2つのファイルを作成します。
train.py
:
import torch
class Model(torch.nn.Module):
def __init__(self):
super(Model, self).__init__()
self.linear = torch.nn.Linear(4, 4)
def forward(self, x):
x = torch.relu(self.linear(x))
return x
model = Model()
x = torch.FloatTensor([[0.2, 0.3, 0.2, 0.7], [0.4, 0.2, 0.8, 0.9]])
with torch.no_grad():
print(model(x))
traced_cell = torch.jit.trace(model, (x))
torch.jit.save(traced_cell, "model.pth")
infer.py
:
import torch
x = torch.FloatTensor([[0.2, 0.3, 0.2, 0.7], [0.4, 0.2, 0.8, 0.9]])
loaded_trace = torch.jit.load("model.pth")
with torch.no_grad():
print(loaded_trace(x))
これらを順番に実行すると、次の結果が得られます。
python train.py
tensor([[0.0000, 0.1845, 0.2910, 0.2497],
[0.0000, 0.5272, 0.3481, 0.1743]])
python infer.py
tensor([[0.0000, 0.1845, 0.2910, 0.2497],
[0.0000, 0.5272, 0.3481, 0.1743]])
結果は同じなので、良いです。(nn.Linearレイヤーの初期化がランダムであるため、ここでは毎回結果が異なることに注意してください)。
TorchScriptは、推論時にグラフを再定義する必要なしに、はるかに複雑なアーキテクチャとグラフ定義(ifステートメント、whileループなどを含む)を単一のファイルに保存できるようにします。より高度な可能性については、ドキュメント(上記のリンク)を参照してください。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加