अचार serializing और एक अजगर वस्तु de-serializing के लिए अजगर पुस्तकालय औजार द्विआधारी प्रोटोकॉल।
जब आप import torch
(या जब आप PyTorch का उपयोग करते हैं) तो यह import pickle
आपके लिए होगा और आपको कॉल करने की आवश्यकता नहीं है pickle.dump()
और pickle.load()
सीधे, जो कि ऑब्जेक्ट को बचाने और लोड करने के तरीके हैं।
वास्तव में, torch.save()
और torch.load()
लपेटो जाएगा pickle.dump()
और pickle.load()
आप के लिए।
state_dict
उल्लेख किया गया एक अन्य उत्तर केवल कुछ और नोटों का हकदार है।
state_dict
PyTorch के अंदर हमारे पास क्या है? वास्तव में दो state_dict
एस हैं।
PyTorch मॉडल है torch.nn.Module
है model.parameters()
learnable मानकों (डब्ल्यू और ख) प्राप्त करने के लिए कॉल। एक बार बेतरतीब ढंग से सेट होने पर ये सीखने योग्य पैरामीटर, समय के साथ जैसे हम सीखते हैं, वैसे ही अपडेट होते जाएंगे। सीखने योग्य पैरामीटर पहले हैं state_dict
।
दूसरा state_dict
आशावादी राज्य है। आपको याद है कि हमारे सीखने योग्य मापदंडों को बेहतर बनाने के लिए अनुकूलक का उपयोग किया जाता है। लेकिन आशावादी state_dict
तय है। वहां सीखने के लिए कुछ भी नहीं।
क्योंकि state_dict
ऑब्जेक्ट्स पायथन डिक्शनरी हैं, उन्हें आसानी से बचाया जा सकता है, अपडेट किया जा सकता है, बदल दिया जा सकता है, और बहाल कर दिया जा सकता है, जो PyTorch मॉडल और ऑप्टिमाइज़र के लिए बहुत अधिक मात्रा में जोड़ देता है।
आइए इसे समझाने के लिए एक सुपर सरल मॉडल बनाएं:
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])
यह कोड निम्नलिखित आउटपुट देगा:
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]}]
ध्यान दें कि यह एक न्यूनतम मॉडल है। आप अनुक्रमिक के ढेर को जोड़ने की कोशिश कर सकते हैं
model = torch.nn.Sequential(
torch.nn.Linear(D_in, H),
torch.nn.Conv2d(A, B, C)
torch.nn.Linear(H, D_out),
)
ध्यान दें कि केवल सीखने योग्य मापदंडों (कंसिस्टेंट लेयर्स, लीनियर लेयर्स इत्यादि) और रजिस्टर्ड बफ़र्स (बैटकमर्म लेयर्स) की परतों में मॉडल की प्रविष्टियाँ हैं state_dict
।
गैर-सीखने योग्य चीजें, ऑप्टिमाइज़र ऑब्जेक्ट से संबंधित होती हैं state_dict
, जिसमें ऑप्टिमाइज़र के राज्य के बारे में जानकारी होती है, साथ ही साथ हाइपरपरमेटर्स का उपयोग किया जाता है।
बाकी कहानी वही है; पूर्वानुमान चरण (यह एक चरण है जब हम प्रशिक्षण के बाद मॉडल का उपयोग करते हैं) भविष्यवाणी के लिए; हमारे द्वारा सीखे गए मापदंडों के आधार पर हम भविष्यवाणी करते हैं। तो अनुमान के लिए, हमें बस मापदंडों को बचाने की जरूरत है model.state_dict()
।
torch.save(model.state_dict(), filepath)
और बाद में उपयोग करने के लिए model.load_state_dict (torch.load (filepath)) model.eval ()
नोट: पिछली पंक्ति को मत भूलना model.eval()
यह मॉडल लोड करने के बाद महत्वपूर्ण है।
इसके अलावा बचाने की कोशिश मत करो torch.save(model.parameters(), filepath)
। model.parameters()
सिर्फ जनरेटर वस्तु है।
दूसरी तरफ, torch.save(model, filepath)
मॉडल ऑब्जेक्ट को स्वयं बचाता है, लेकिन ध्यान रखें कि मॉडल में ऑप्टिमाइज़र नहीं है state_dict
। अनुकूलक के राज्य को बचाने के लिए @Jadiel de Armas द्वारा अन्य उत्कृष्ट उत्तर की जाँच करें।