The acar alat perpustakaan Python protokol biner untuk serialisasi dan de-serialisasi objek Python.
Ketika Anda import torch
(atau ketika Anda menggunakan PyTorch) itu akan import pickle
untuk Anda dan Anda tidak perlu menelepon pickle.dump()
dan pickle.load()
langsung, yang merupakan metode untuk menyimpan dan memuat objek.
Bahkan, torch.save()
dan torch.load()
akan membungkus pickle.dump()
dan pickle.load()
untuk Anda.
Sebuah state_dict
jawaban lain yang disebutkan layak hanya beberapa catatan lagi.
Apa state_dict
yang kita miliki di dalam PyTorch? Sebenarnya ada dua state_dict
s.
Model PyTorch torch.nn.Module
memiliki model.parameters()
panggilan untuk mendapatkan parameter yang dapat dipelajari (w dan b). Parameter yang dapat dipelajari ini, setelah ditetapkan secara acak, akan diperbarui seiring waktu seperti yang kita pelajari. Parameter yang bisa dipelajari adalah yang pertama state_dict
.
Yang kedua state_dict
adalah dict state optimizer. Anda ingat bahwa pengoptimal digunakan untuk meningkatkan parameter yang dapat dipelajari. Tetapi optimizer state_dict
sudah diperbaiki. Tidak ada yang bisa dipelajari di sana.
Karena state_dict
objek adalah kamus Python, mereka dapat dengan mudah disimpan, diperbarui, diubah, dan dipulihkan, menambahkan banyak modularitas untuk model dan pengoptimal PyTorch.
Mari kita buat model super sederhana untuk menjelaskan ini:
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])
Kode ini akan menampilkan yang berikut:
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]}]
Perhatikan ini adalah model minimal. Anda dapat mencoba menambahkan tumpukan berurutan
model = torch.nn.Sequential(
torch.nn.Linear(D_in, H),
torch.nn.Conv2d(A, B, C)
torch.nn.Linear(H, D_out),
)
Perhatikan bahwa hanya lapisan dengan parameter yang dapat dipelajari (lapisan konvolusional, lapisan linier, dll.) Dan buffer terdaftar (lapisan batchnorm) memiliki entri dalam model state_dict
.
Hal-hal yang tidak dapat dipelajari, termasuk dalam objek pengoptimal state_dict
, yang berisi informasi tentang status pengoptimal, serta hyperparameter yang digunakan.
Kisah selanjutnya sama; dalam fase inferensi (ini adalah fase ketika kita menggunakan model setelah pelatihan) untuk memprediksi; kami memprediksi berdasarkan parameter yang kami pelajari. Jadi untuk kesimpulan, kita hanya perlu menyimpan parameter model.state_dict()
.
torch.save(model.state_dict(), filepath)
Dan untuk menggunakan model.load_state_dict nanti (torch.load (filepath)) model.eval ()
Catatan: Jangan lupa baris terakhir model.eval()
ini sangat penting setelah memuat model.
Juga jangan mencoba menyimpan torch.save(model.parameters(), filepath)
. Itu model.parameters()
hanya objek generator.
Di sisi lain, torch.save(model, filepath)
menyimpan objek model itu sendiri, tetapi perlu diingat model tidak memiliki pengoptimal state_dict
. Periksa jawaban luar biasa lainnya oleh @Jadiel de Armas untuk menyimpan dict state optimizer.