Turşu seri ve bir Python nesnesi de-serializing için Python kütüphanesi uygular ikili protokoller.
Siz import torch
(veya PyTorch kullandığınızda) bu import pickle
sizin için olacaktır ve nesneyi kaydetme ve yükleme yöntemleri olan pickle.dump()
ve pickle.load()
doğrudan aramanıza gerek yoktur .
Aslında, torch.save()
ve torch.load()
kaydırılır pickle.dump()
ve pickle.load()
senin için.
A state_dict
verilen diğer cevap sadece birkaç not daha hak ediyor.
state_dict
PyTorch'un içinde ne var? Aslında iki tane state_dict
s var.
PyTorch modelinin öğrenilebilir parametreler (w ve b) alma çağrısı torch.nn.Module
vardır model.parameters()
. Bu öğrenilebilir parametreler, rasgele ayarlandığında, öğrendikçe zaman içinde güncellenir. Öğrenilebilir parametreler ilktir state_dict
.
İkincisi state_dict
, optimize edici durum dikte. Optimize edicinin öğrenilebilir parametrelerimizi geliştirmek için kullanıldığını hatırlıyorsunuz. Ancak optimize edici state_dict
düzeltildi. Orada öğrenecek bir şey yok.
Çünkü state_dict
nesneler Python sözlükleri vardır, onlar kolayca PyTorch modelleri ve optimize etmek modülerlik büyük bir ekleyerek, kaydedilen güncellenen, değişmiş ve geri yüklenebilir.
Bunu açıklamak için çok basit bir model oluşturalım:
import torch
import torch.optim as optim
model = torch.nn.Linear(5, 2)
# Initialize optimizer
optimizer = optim.SGD(model.parameters(), lr=0.001, momentum=0.9)
print("Model's state_dict:")
for param_tensor in model.state_dict():
print(param_tensor, "\t", model.state_dict()[param_tensor].size())
print("Model weight:")
print(model.weight)
print("Model bias:")
print(model.bias)
print("---")
print("Optimizer's state_dict:")
for var_name in optimizer.state_dict():
print(var_name, "\t", optimizer.state_dict()[var_name])
Bu kod aşağıdakileri verir:
Model's state_dict:
weight torch.Size([2, 5])
bias torch.Size([2])
Model weight:
Parameter containing:
tensor([[ 0.1328, 0.1360, 0.1553, -0.1838, -0.0316],
[ 0.0479, 0.1760, 0.1712, 0.2244, 0.1408]], requires_grad=True)
Model bias:
Parameter containing:
tensor([ 0.4112, -0.0733], requires_grad=True)
---
Optimizer's state_dict:
state {}
param_groups [{'lr': 0.001, 'momentum': 0.9, 'dampening': 0, 'weight_decay': 0, 'nesterov': False, 'params': [140695321443856, 140695321443928]}]
Bunun minimal bir model olduğunu unutmayın. Sıralı yığın eklemeyi deneyebilirsiniz
model = torch.nn.Sequential(
torch.nn.Linear(D_in, H),
torch.nn.Conv2d(A, B, C)
torch.nn.Linear(H, D_out),
)
Yalnızca öğrenilebilir parametrelere sahip katmanların (evrişimli katmanlar, doğrusal katmanlar, vb.) Ve kayıtlı arabelleklerin (batchnorm katmanları) modellerde girişleri olduğunu unutmayın state_dict
.
Öğrenilemeyen şeyler, optimize state_dict
edicinin durumu ve kullanılan hiperparametreler hakkında bilgi içeren optimize edici nesnesine aittir .
Hikayenin geri kalanı aynı; çıkarım aşamasında (bu, eğitimden sonra modeli kullandığımız bir aşamadır) tahmin için; öğrendiğimiz parametrelere dayanarak tahmin yapıyoruz. Yani çıkarım için, sadece parametreleri kaydetmemiz gerekiyor model.state_dict()
.
torch.save(model.state_dict(), filepath)
Ve daha sonra kullanmak üzere model.load_state_dict (torch.load (dosyayolu)) model.eval ()
Not: model.eval()
Bu modeli yükledikten sonra çok önemli olan son satırı unutmayın .
Ayrıca kaydetmeye çalışmayın torch.save(model.parameters(), filepath)
. model.parameters()
Sadece jeneratör nesnesidir.
Diğer tarafta, torch.save(model, filepath)
model nesnesinin kendisini kaydeder, ancak modelin optimize ediciye sahip olmadığını unutmayın state_dict
. Optimizer'ın devlet kararını kaydetmek için @Jadiel de Armas'ın diğer mükemmel cevabını kontrol edin.