Các dưa cụ thư viện Python giao thức nhị phân cho serializing và de-serializing một đối tượng Python.
Khi bạn import torch
(hoặc khi bạn sử dụng PyTorch), nó sẽ import pickle
cho bạn và bạn không cần phải gọi pickle.dump()
và pickle.load()
trực tiếp, đó là các phương thức để lưu và tải đối tượng.
Trong thực tế, torch.save()
và torch.load()
sẽ bọc pickle.dump()
và pickle.load()
cho bạn.
Một state_dict
câu trả lời khác được đề cập xứng đáng chỉ là một vài ghi chú.
Có gì state_dict
chúng ta có bên trong PyTorch? Thực tế có hai state_dict
s.
Mô hình PyTorch torch.nn.Module
có model.parameters()
lệnh gọi để có được các tham số có thể học được (w và b). Các tham số có thể học được này, một khi được đặt ngẫu nhiên, sẽ cập nhật theo thời gian khi chúng ta tìm hiểu. Thông số có thể học được là đầu tiên state_dict
.
Thứ hai state_dict
là dict nhà nước tối ưu hóa. Bạn nhớ lại rằng trình tối ưu hóa được sử dụng để cải thiện các tham số có thể học được của chúng tôi. Nhưng trình tối ưu hóa đã state_dict
được sửa. Không có gì để học trong đó.
Bởi vì state_dict
các đối tượng là từ điển Python, chúng có thể dễ dàng lưu, cập nhật, thay đổi và khôi phục, thêm rất nhiều mô-đun vào các mô hình và tối ưu hóa PyTorch.
Hãy tạo một mô hình siêu đơn giản để giải thích điều này:
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])
Mã này sẽ xuất ra như sau:
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]}]
Lưu ý đây là một mô hình tối thiểu. Bạn có thể thử thêm ngăn xếp tuần tự
model = torch.nn.Sequential(
torch.nn.Linear(D_in, H),
torch.nn.Conv2d(A, B, C)
torch.nn.Linear(H, D_out),
)
Lưu ý rằng chỉ các lớp có tham số có thể học được (lớp chập, lớp tuyến tính, v.v.) và bộ đệm đã đăng ký (lớp batchnorm) có các mục trong mô hình state_dict
.
Những thứ không thể học được, thuộc về đối tượng tối ưu hóa state_dict
, chứa thông tin về trạng thái của trình tối ưu hóa, cũng như các siêu đường kính được sử dụng.
Phần còn lại của câu chuyện là như nhau; trong giai đoạn suy luận (đây là giai đoạn khi chúng ta sử dụng mô hình sau khi đào tạo) để dự đoán; chúng tôi dự đoán dựa trên các thông số chúng tôi đã học. Vì vậy, để suy luận, chúng ta chỉ cần lưu các tham số model.state_dict()
.
torch.save(model.state_dict(), filepath)
Và để sử dụng mô hình sau.load_state_dict (Torch.load (filepath)) model.eval ()
Lưu ý: Đừng quên dòng cuối cùng model.eval()
này là rất quan trọng sau khi tải mô hình.
Cũng đừng cố gắng tiết kiệm torch.save(model.parameters(), filepath)
. Đây model.parameters()
chỉ là đối tượng máy phát điện.
Mặt khác, torch.save(model, filepath)
lưu chính đối tượng mô hình, nhưng hãy nhớ rằng mô hình không có trình tối ưu hóa state_dict
. Kiểm tra câu trả lời xuất sắc khác của @Jadiel de Armas để lưu chính tả trạng thái của trình tối ưu hóa.