Ich suchte nach alternativen Möglichkeiten, um ein trainiertes Modell in PyTorch zu speichern. Bisher habe ich zwei Alternativen gefunden.
- torch.save () zum Speichern eines Modells und torch.load () zum Laden eines Modells.
- model.state_dict () zum Speichern eines trainierten Modells und model.load_state_dict () zum Laden des gespeicherten Modells.
Ich bin auf diese Diskussion gestoßen, bei der Ansatz 2 gegenüber Ansatz 1 empfohlen wird.
Meine Frage ist, warum der zweite Ansatz bevorzugt wird. Liegt es nur daran, dass torch.nn- Module diese beiden Funktionen haben und wir ermutigt werden, sie zu verwenden?
python
serialization
deep-learning
pytorch
tensor
Wasi Ahmad
quelle
quelle
torch.save(model, f)
undtorch.save(model.state_dict(), f)
. Die gespeicherten Dateien haben die gleiche Größe. Jetzt bin ich verwirrt. Außerdem fand ich die Verwendung von pickle zum Speichern von model.state_dict () extrem langsam. Ich denke, der beste Weg ist die Verwendung,torch.save(model.state_dict(), f)
da Sie die Erstellung des Modells übernehmen und die Taschenlampe das Laden der Modellgewichte übernimmt, wodurch mögliche Probleme beseitigt werden. Referenz: diskutieren.pytorch.org/t/saving-torch-models/838/4Antworten:
Ich habe diese Seite auf ihrem Github-Repo gefunden. Ich füge den Inhalt einfach hier ein.
Empfohlener Ansatz zum Speichern eines Modells
Es gibt zwei Hauptansätze zum Serialisieren und Wiederherstellen eines Modells.
Der erste (empfohlene) speichert und lädt nur die Modellparameter:
Dann später:
Der zweite speichert und lädt das gesamte Modell:
Dann später:
In diesem Fall sind die serialisierten Daten jedoch an die spezifischen Klassen und die genaue verwendete Verzeichnisstruktur gebunden, sodass sie bei Verwendung in anderen Projekten oder nach einigen schwerwiegenden Refaktoren auf verschiedene Weise beschädigt werden können.
quelle
Es hängt davon ab, was Sie tun möchten.
Fall 1: Speichern Sie das Modell, um es selbst als Rückschluss zu verwenden : Sie speichern das Modell, stellen es wieder her und ändern das Modell in den Bewertungsmodus. Dies geschieht , weil Sie in der Regel
BatchNorm
undDropout
Schichten , die in Zug - Modus auf dem Bau von Standard sind:Fall 2: Modell speichern, um das Training später fortzusetzen : Wenn Sie das Modell, das Sie speichern möchten, weiter trainieren müssen, müssen Sie mehr als nur das Modell speichern. Sie müssen auch den Status des Optimierers, der Epochen, der Partitur usw. speichern. Sie würden dies folgendermaßen tun:
Um das Training fortzusetzen, würden Sie Dinge tun wie:
state = torch.load(filepath)
und dann, um den Zustand jedes einzelnen Objekts wiederherzustellen, so etwas wie:Da Sie das Training wieder aufnehmen, Rufen
model.eval()
Sie NICHT an , wenn Sie den Status beim Laden wiederherstellen, da Sie das wieder aufnehmen.Fall 3: Modell, das von einer anderen Person ohne Zugriff auf Ihren Code verwendet werden soll : In Tensorflow können Sie eine
.pb
Datei erstellen , die sowohl die Architektur als auch die Gewichte des Modells definiert. Dies ist besonders bei der Verwendung sehr praktischTensorflow serve
. Der äquivalente Weg, dies in Pytorch zu tun, wäre:Dieser Weg ist immer noch nicht kugelsicher und da Pytorch immer noch viele Änderungen durchläuft, würde ich es nicht empfehlen.
quelle
torch.load
nur ein OrderedDict zurückgegeben. Wie erhalten Sie das Modell, um Vorhersagen zu treffen?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 esimport pickle
für Sie und Sie müssen nicht anrufenpickle.dump()
undpickle.load()
direkt, was die Methoden zu speichern und das Objekt zu laden.In der Tat
torch.save()
undtorch.load()
wird wickelnpickle.dump()
undpickle.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
mussmodel.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:
Dieser Code gibt Folgendes aus:
Beachten Sie, dass dies ein Minimalmodell ist. Sie können versuchen, einen Stapel von sequentiellen hinzuzufügen
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()
.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)
. Dasmodel.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ügtstate_dict
. Überprüfen Sie die andere ausgezeichnete Antwort von @Jadiel de Armas, um das Statusdiktat des Optimierers zu speichern.quelle
Eine übliche PyTorch-Konvention besteht darin, Modelle mit der Dateierweiterung .pt oder .pth zu speichern.
Ganzes Modell speichern / laden Speichern:
Belastung:
Die Modellklasse muss irgendwo definiert werden
quelle
Wenn Sie das Modell speichern und das Training später fortsetzen möchten:
Einzelne GPU: Speichern:
Belastung:
Mehrere GPUs: Speichern
Belastung:
quelle