জরান serializing এবং একটি পাইথন বস্তুর ডি serializing জন্য পাইথন গ্রন্থাগার কার্যকরী বাইনারি প্রোটোকল।
যখন আপনি import torch
(বা যখন আপনি পাইটর্চ ব্যবহার করবেন) এটি import pickle
আপনার জন্য হবে এবং আপনাকে কল করার দরকার নেই pickle.dump()
এবং pickle.load()
সরাসরি, যা বস্তুটি সংরক্ষণ এবং লোড করার পদ্ধতি।
আসলে, torch.save()
এবং torch.load()
মোড়ানো pickle.dump()
এবং আপনার pickle.load()
জন্য হবে ।
state_dict
উল্লিখিত অন্য একটি উত্তর আরও কয়েকটি নোটের দাবিদার।
state_dict
পাইটর্কের ভিতরে আমাদের কী আছে? আসলে দুটি state_dict
এস।
পাইটর্চ মডেলটিতে শেখার যোগ্য পরামিতি ( ডাব্লু এবং বি) পাওয়ার জন্য কল torch.nn.Module
রয়েছে model.parameters()
। একবারে এলোমেলোভাবে সেট করা এই শেখার যোগ্য প্যারামিটারগুলি আমাদের শেখার সাথে সাথে সময়ের সাথে সাথে আপডেট হবে। বোধগম্য পরামিতিগুলি প্রথম state_dict
।
দ্বিতীয়টি state_dict
হ'ল অপটিমাইজার রাষ্ট্র আদেশ। আপনি মনে করতে পারেন যে আমাদের শেখার যোগ্য পরামিতিগুলি উন্নত করতে অপ্টিমাইজারটি ব্যবহৃত হয়। তবে অপটিমাইজার state_dict
স্থির রয়েছে। সেখানে শেখার মতো কিছুই নেই।
যেহেতু state_dict
বস্তুগুলি পাইথন অভিধান, সেগুলি সহজেই সংরক্ষণ করা যায়, আপডেট করা যায়, পরিবর্তন করা যায় এবং পুনরুদ্ধার করা যায়, পাইটর্চ মডেলগুলি এবং অপ্টিমাইজারগুলিতে প্রচুর পরিমাণে মডুলারিটি যুক্ত করে।
আসুন এটি ব্যাখ্যা করার জন্য একটি দুর্দান্ত সাধারণ মডেল তৈরি করুন:
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.eval()
এটি মডেলটি লোড করার পরে গুরুত্বপূর্ণ।
এছাড়াও সংরক্ষণ করার চেষ্টা করবেন না torch.save(model.parameters(), filepath)
। এটি model.parameters()
হ'ল জেনারেটর অবজেক্ট।
অন্যদিকে, torch.save(model, filepath)
মডেল অবজেক্টটি নিজেই সংরক্ষণ করে, তবে মনে রাখবেন মডেলটির অপটিমাইজারটি নেই state_dict
। অপ্টিমাইজারের রাজ্য ডিকটি সংরক্ষণ করতে @ জাদিল ডি আরমাসের অন্যান্য দুর্দান্ত উত্তরটি দেখুন।