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 picklesizin 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_dictverilen diğer cevap sadece birkaç not daha hak ediyor.
state_dictPyTorch'un içinde ne var? Aslında iki tane state_dicts var.
PyTorch modelinin öğrenilebilir parametreler (w ve b) alma çağrısı torch.nn.Modulevardı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_dictdüzeltildi. Orada öğrenecek bir şey yok.
Çünkü state_dictnesneler 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_dictedicinin 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.