Die pickle Python-Bibliothek implementiert binäre Protokolle zum Serialisieren und De-Serialisieren eines Python-Objekts.
Wenn Sie import torch
(oder wenn Sie PyTorch verwenden), wird es import pickle
für Sie und Sie müssen nicht anrufen pickle.dump()
undpickle.load()
direkt, was die Methoden zu speichern und das Objekt zu laden.
In der Tat torch.save()
und torch.load()
wird wickeln pickle.dump()
und pickle.load()
für Sie.
EIN state_dict
andere Antwort verdient nur noch ein paar Anmerkungen.
Was state_dict
haben wir in PyTorch? Es gibt tatsächlich zweistate_dict
s.
Das PyTorch-Modell torch.nn.Module
muss model.parameters()
aufgerufen werden, um lernbare Parameter (w und b) zu erhalten. Diese lernbaren Parameter werden nach dem Zufallsprinzip im Laufe der Zeit aktualisiert, sobald wir lernen. Lernbare Parameter sind die erstenstate_dict
.
Das zweite state_dict
ist das Optimierungsstatus-Diktat. Sie erinnern sich, dass der Optimierer verwendet wird, um unsere lernbaren Parameter zu verbessern. Aber der Optimiererstate_dict
ist behoben. Dort gibt es nichts zu lernen.
Da es sich bei state_dict
Objekten um Python-Wörterbücher handelt, können sie einfach gespeichert, aktualisiert, geändert und wiederhergestellt werden, wodurch PyTorch-Modelle und -Optimierer erheblich modularisiert werden.
Lassen Sie uns ein super einfaches Modell erstellen, um dies zu erklären:
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])
Dieser Code gibt Folgendes aus:
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]}]
Beachten Sie, dass dies ein Minimalmodell ist. Sie können versuchen, einen Stapel von sequentiellen hinzuzufügen
model = torch.nn.Sequential(
torch.nn.Linear(D_in, H),
torch.nn.Conv2d(A, B, C)
torch.nn.Linear(H, D_out),
)
Beachten Sie, dass nur Schichten mit lernbaren Parametern (Faltungsschichten, lineare Schichten usw.) und registrierten Puffern (Batchnorm-Schichten) Einträge in den Modellen haben state_dict
.
Nicht lernbare Dinge gehören zum Optimierungsobjekt state_dict
, das Informationen über den Status des Optimierers sowie die verwendeten Hyperparameter enthält.
Der Rest der Geschichte ist der gleiche; in der Inferenzphase (dies ist eine Phase, in der wir das Modell nach dem Training verwenden) zur Vorhersage; Wir sagen voraus, basierend auf den Parametern, die wir gelernt haben. Für die Schlussfolgerung müssen wir nur die Parameter speichern model.state_dict()
.
torch.save(model.state_dict(), filepath)
Und um später model.load_state_dict (torch.load (Dateipfad)) model.eval () zu verwenden
Hinweis: Vergessen Sie nicht die letzte Zeile, die model.eval()
nach dem Laden des Modells von entscheidender Bedeutung ist.
Versuchen Sie auch nicht zu speichern torch.save(model.parameters(), filepath)
. Das model.parameters()
ist nur das Generatorobjekt.
Auf der anderen Seite wird torch.save(model, filepath)
das Modellobjekt selbst gespeichert. Beachten Sie jedoch, dass das Modell nicht über das Optimierungsobjekt verfügt state_dict
. Überprüfen Sie die andere ausgezeichnete Antwort von @Jadiel de Armas, um das Statusdiktat des Optimierers zu speichern.