TensorFlow.org-এ দেখুন | Google Colab-এ চালান | GitHub-এ উৎস দেখুন | নোটবুক ডাউনলোড করুন |
"একটি টেনসরফ্লো মডেল সংরক্ষণ" বাক্যাংশটি সাধারণত দুটি জিনিসের মধ্যে একটিকে বোঝায়:
- চেকপয়েন্ট, বা
- সংরক্ষিত মডেল।
চেকপয়েন্ট একটি মডেল দ্বারা ব্যবহৃত সমস্ত পরামিতি ( tf.Variable
. পরিবর্তনশীল বস্তু) এর সঠিক মান ক্যাপচার করে। চেকপয়েন্টগুলিতে মডেল দ্বারা সংজ্ঞায়িত গণনার কোনও বিবরণ থাকে না এবং এইভাবে সাধারণত শুধুমাত্র তখনই উপযোগী হয় যখন সংরক্ষিত প্যারামিটার মানগুলি ব্যবহার করবে এমন উত্স কোড উপলব্ধ থাকে৷
অন্যদিকে SavedModel বিন্যাসে প্যারামিটার মান (চেকপয়েন্ট) ছাড়াও মডেল দ্বারা সংজ্ঞায়িত গণনার একটি ক্রমিক বিবরণ অন্তর্ভুক্ত রয়েছে। এই ফর্ম্যাটে মডেলগুলি মডেল তৈরি করা সোর্স কোড থেকে স্বাধীন। এইভাবে এগুলি TensorFlow Serving, TensorFlow Lite, TensorFlow.js, বা অন্যান্য প্রোগ্রামিং ভাষায় (C, C++, Java, Go, Rust, C# ইত্যাদি। TensorFlow API) এর মাধ্যমে স্থাপনের জন্য উপযুক্ত।
এই গাইড চেকপয়েন্ট লেখা এবং পড়ার জন্য API গুলি কভার করে৷
সেটআপ
import tensorflow as tf
class Net(tf.keras.Model):
"""A simple linear model."""
def __init__(self):
super(Net, self).__init__()
self.l1 = tf.keras.layers.Dense(5)
def call(self, x):
return self.l1(x)
net = Net()
tf.keras
প্রশিক্ষণ API থেকে সংরক্ষণ করা হচ্ছে
সংরক্ষণ এবং পুনরুদ্ধারের বিষয়ে tf.keras
নির্দেশিকা দেখুন।
tf.keras.Model.save_weights
একটি টেনসরফ্লো চেকপয়েন্ট সংরক্ষণ করে।
net.save_weights('easy_checkpoint')
চেকপয়েন্ট লেখা
একটি tf.Variable
মডেলের স্থায়ী অবস্থা tf. পরিবর্তনশীল বস্তুতে সংরক্ষিত হয়। এগুলি সরাসরি তৈরি করা যেতে পারে, তবে প্রায়শই tf.keras.layers
বা tf.keras.Model
এর মতো উচ্চ-স্তরের API-এর মাধ্যমে তৈরি করা হয়।
ভেরিয়েবলগুলি পরিচালনা করার সবচেয়ে সহজ উপায় হল সেগুলিকে পাইথন অবজেক্টের সাথে সংযুক্ত করা, তারপর সেই বস্তুগুলিকে উল্লেখ করা।
tf.train.Checkpoint
, tf.keras.layers.Layer
, এবং tf.keras.Model
এর সাবক্লাসগুলি স্বয়ংক্রিয়ভাবে তাদের বৈশিষ্ট্যগুলির জন্য নির্ধারিত ভেরিয়েবলগুলিকে ট্র্যাক করে৷ নিম্নলিখিত উদাহরণটি একটি সাধারণ রৈখিক মডেল তৈরি করে, তারপরে চেকপয়েন্টগুলি লেখে যা মডেলের সমস্ত ভেরিয়েবলের মান ধারণ করে।
আপনি Model.save_weights
দিয়ে সহজেই একটি মডেল-চেকপয়েন্ট সংরক্ষণ করতে পারেন।
ম্যানুয়াল চেকপয়েন্টিং
সেটআপ
tf.train.Checkpoint
এর সমস্ত বৈশিষ্ট্য প্রদর্শন করতে সাহায্য করতে, একটি খেলনা ডেটাসেট এবং অপ্টিমাইজেশান ধাপ সংজ্ঞায়িত করুন:
def toy_dataset():
inputs = tf.range(10.)[:, None]
labels = inputs * 5. + tf.range(5.)[None, :]
return tf.data.Dataset.from_tensor_slices(
dict(x=inputs, y=labels)).repeat().batch(2)
def train_step(net, example, optimizer):
"""Trains `net` on `example` using `optimizer`."""
with tf.GradientTape() as tape:
output = net(example['x'])
loss = tf.reduce_mean(tf.abs(output - example['y']))
variables = net.trainable_variables
gradients = tape.gradient(loss, variables)
optimizer.apply_gradients(zip(gradients, variables))
return loss
চেকপয়েন্ট অবজেক্ট তৈরি করুন
ম্যানুয়ালি একটি চেকপয়েন্ট তৈরি করতে একটি tf.train.Checkpoint
অবজেক্ট ব্যবহার করুন, যেখানে আপনি যে বস্তুগুলিকে চেকপয়েন্ট করতে চান তা অবজেক্টের বৈশিষ্ট্য হিসাবে সেট করা আছে।
একটি tf.train.CheckpointManager
একাধিক চেকপয়েন্ট পরিচালনার জন্যও সহায়ক হতে পারে।
opt = tf.keras.optimizers.Adam(0.1)
dataset = toy_dataset()
iterator = iter(dataset)
ckpt = tf.train.Checkpoint(step=tf.Variable(1), optimizer=opt, net=net, iterator=iterator)
manager = tf.train.CheckpointManager(ckpt, './tf_ckpts', max_to_keep=3)
ট্রেন এবং মডেল চেকপয়েন্ট
নিম্নলিখিত প্রশিক্ষণ লুপ মডেল এবং একটি অপ্টিমাইজারের একটি উদাহরণ তৈরি করে, তারপর তাদের একটি tf.train.Checkpoint
অবজেক্টে একত্রিত করে। এটি ডেটার প্রতিটি ব্যাচের একটি লুপে প্রশিক্ষণের ধাপকে কল করে এবং পর্যায়ক্রমে ডিস্কে চেকপয়েন্টগুলি লেখে।
def train_and_checkpoint(net, manager):
ckpt.restore(manager.latest_checkpoint)
if manager.latest_checkpoint:
print("Restored from {}".format(manager.latest_checkpoint))
else:
print("Initializing from scratch.")
for _ in range(50):
example = next(iterator)
loss = train_step(net, example, opt)
ckpt.step.assign_add(1)
if int(ckpt.step) % 10 == 0:
save_path = manager.save()
print("Saved checkpoint for step {}: {}".format(int(ckpt.step), save_path))
print("loss {:1.2f}".format(loss.numpy()))
train_and_checkpoint(net, manager)
Initializing from scratch. Saved checkpoint for step 10: ./tf_ckpts/ckpt-1 loss 31.27 Saved checkpoint for step 20: ./tf_ckpts/ckpt-2 loss 24.68 Saved checkpoint for step 30: ./tf_ckpts/ckpt-3 loss 18.12 Saved checkpoint for step 40: ./tf_ckpts/ckpt-4 loss 11.65 Saved checkpoint for step 50: ./tf_ckpts/ckpt-5 loss 5.39
পুনরুদ্ধার করুন এবং প্রশিক্ষণ চালিয়ে যান
প্রথম প্রশিক্ষণ চক্রের পরে আপনি একটি নতুন মডেল এবং ব্যবস্থাপক পাস করতে পারেন, তবে আপনি যেখান থেকে ছেড়েছিলেন ঠিক সেখানেই প্রশিক্ষণ শুরু করুন:
opt = tf.keras.optimizers.Adam(0.1)
net = Net()
dataset = toy_dataset()
iterator = iter(dataset)
ckpt = tf.train.Checkpoint(step=tf.Variable(1), optimizer=opt, net=net, iterator=iterator)
manager = tf.train.CheckpointManager(ckpt, './tf_ckpts', max_to_keep=3)
train_and_checkpoint(net, manager)
Restored from ./tf_ckpts/ckpt-5 Saved checkpoint for step 60: ./tf_ckpts/ckpt-6 loss 1.50 Saved checkpoint for step 70: ./tf_ckpts/ckpt-7 loss 1.27 Saved checkpoint for step 80: ./tf_ckpts/ckpt-8 loss 0.56 Saved checkpoint for step 90: ./tf_ckpts/ckpt-9 loss 0.70 Saved checkpoint for step 100: ./tf_ckpts/ckpt-10 loss 0.35
tf.train.CheckpointManager
অবজেক্ট পুরানো চেকপয়েন্ট মুছে দেয়। উপরে এটি শুধুমাত্র তিনটি সাম্প্রতিক চেকপয়েন্ট রাখার জন্য কনফিগার করা হয়েছে।
print(manager.checkpoints) # List the three remaining checkpoints
['./tf_ckpts/ckpt-8', './tf_ckpts/ckpt-9', './tf_ckpts/ckpt-10']
এই পথগুলি, যেমন './tf_ckpts/ckpt-10'
, ডিস্কের ফাইল নয়৷ পরিবর্তে এগুলি একটি index
ফাইল এবং এক বা একাধিক ডেটা ফাইলের উপসর্গ যা পরিবর্তনশীল মান ধারণ করে। এই উপসর্গগুলিকে একটি একক checkpoint
ফাইলে ( './tf_ckpts/checkpoint'
) একসাথে গোষ্ঠীবদ্ধ করা হয় যেখানে CheckpointManager
ম্যানেজার তার অবস্থা সংরক্ষণ করে।
ls ./tf_ckpts
checkpoint ckpt-8.data-00000-of-00001 ckpt-9.index ckpt-10.data-00000-of-00001 ckpt-8.index ckpt-10.index ckpt-9.data-00000-of-00001
লোডিং মেকানিক্স
TensorFlow ভেরিয়েবলকে চেকপয়েন্টেড মানগুলির সাথে মেলে, নামযুক্ত প্রান্ত সহ একটি নির্দেশিত গ্রাফ অতিক্রম করে, বস্তুটি লোড করা থেকে শুরু করে। প্রান্তের নামগুলি সাধারণত বস্তুর বৈশিষ্ট্যের নাম থেকে আসে, উদাহরণস্বরূপ self.l1 = tf.keras.layers.Dense(5)
এ "l1"
। tf.train.Checkpoint
তার কীওয়ার্ড আর্গুমেন্টের নাম ব্যবহার করে, যেমন tf.train.Checkpoint(step=...)
এর "step"
তে।
উপরের উদাহরণ থেকে নির্ভরতা গ্রাফটি এইরকম দেখাচ্ছে:
অপ্টিমাইজারটি লাল, নিয়মিত ভেরিয়েবলগুলি নীল রঙে এবং অপ্টিমাইজার স্লট ভেরিয়েবলগুলি কমলা রঙে৷ অন্যান্য নোডগুলি-উদাহরণস্বরূপ, tf.train.Checkpoint
এর প্রতিনিধিত্ব করে—কালো রঙে।
স্লট ভেরিয়েবলগুলি অপ্টিমাইজারের অবস্থার অংশ, কিন্তু একটি নির্দিষ্ট ভেরিয়েবলের জন্য তৈরি করা হয়। উদাহরণস্বরূপ, উপরের 'm'
প্রান্তগুলি ভরবেগের সাথে সামঞ্জস্যপূর্ণ, যা অ্যাডাম অপ্টিমাইজার প্রতিটি পরিবর্তনশীলের জন্য ট্র্যাক করে। স্লট ভেরিয়েবল শুধুমাত্র একটি চেকপয়েন্টে সংরক্ষিত হয় যদি ভেরিয়েবল এবং অপ্টিমাইজার উভয়ই সংরক্ষিত হয়, এভাবে ড্যাশড প্রান্তগুলি।
একটি tf.train.Checkpoint
অবজেক্টে restore
কল করা অনুরোধকৃত পুনরুদ্ধারকে সারিবদ্ধ করে, Checkpoint
অবজেক্ট থেকে একটি মিলিত পথ পাওয়া মাত্রই পরিবর্তনশীল মান পুনরুদ্ধার করে। উদাহরণস্বরূপ, আপনি নেটওয়ার্ক এবং স্তরের মাধ্যমে এটিতে একটি পথ পুনর্গঠন করে উপরে সংজ্ঞায়িত মডেল থেকে শুধুমাত্র পক্ষপাত লোড করতে পারেন।
to_restore = tf.Variable(tf.zeros([5]))
print(to_restore.numpy()) # All zeros
fake_layer = tf.train.Checkpoint(bias=to_restore)
fake_net = tf.train.Checkpoint(l1=fake_layer)
new_root = tf.train.Checkpoint(net=fake_net)
status = new_root.restore(tf.train.latest_checkpoint('./tf_ckpts/'))
print(to_restore.numpy()) # This gets the restored value.
[0. 0. 0. 0. 0.] [2.7209885 3.7588918 4.421351 4.1466427 4.0712557]
এই নতুন অবজেক্টের জন্য নির্ভরতা গ্রাফ হল আপনার উপরে লেখা বৃহত্তর চেকপয়েন্টের অনেক ছোট সাবগ্রাফ। এটি শুধুমাত্র পক্ষপাত এবং একটি সংরক্ষণ কাউন্টার অন্তর্ভুক্ত করে যা tf.train.Checkpoint
চেকপয়েন্ট সংখ্যা করতে ব্যবহার করে।
restore
একটি স্ট্যাটাস অবজেক্ট প্রদান করে, যার ঐচ্ছিক দাবি রয়েছে। নতুন Checkpoint
তৈরি করা সমস্ত বস্তু পুনরুদ্ধার করা হয়েছে, তাই status.assert_existing_objects_matched
পাস।
status.assert_existing_objects_matched()
<tensorflow.python.training.tracking.util.CheckpointLoadStatus at 0x7f93a075b9d0>
লেয়ার কার্নেল এবং অপ্টিমাইজারের ভেরিয়েবল সহ চেকপয়েন্টে অনেকগুলি বস্তু রয়েছে যা মেলেনি। status.assert_consumed
শুধুমাত্র পাস হয় যদি চেকপয়েন্ট এবং প্রোগ্রাম ঠিক মেলে, এবং এখানে একটি ব্যতিক্রম নিক্ষেপ করবে।
বিলম্বিত পুনঃস্থাপন
টেনসরফ্লোতে Layer
অবজেক্টগুলি ভেরিয়েবল তৈরিকে তাদের প্রথম কলে পিছিয়ে দিতে পারে, যখন ইনপুট আকার উপলব্ধ থাকে। উদাহরণস্বরূপ, একটি Dense
স্তরের কার্নেলের আকৃতি লেয়ারের ইনপুট এবং আউটপুট আকার উভয়ের উপর নির্ভর করে এবং তাই কনস্ট্রাক্টর আর্গুমেন্ট হিসাবে প্রয়োজনীয় আউটপুট আকৃতিটি নিজেই ভেরিয়েবল তৈরি করার জন্য যথেষ্ট তথ্য নয়। যেহেতু একটি Layer
কল করলে ভেরিয়েবলের মানও পড়ে, তাই ভেরিয়েবলের সৃষ্টি এবং এর প্রথম ব্যবহারের মধ্যে একটি পুনরুদ্ধার ঘটতে হবে।
এই বাগধারাটিকে সমর্থন করার জন্য, tf.train.Checkpoint
পুনরুদ্ধারগুলিকে পিছিয়ে দেয় যেগুলির এখনও একটি মিল ভেরিয়েবল নেই৷
deferred_restore = tf.Variable(tf.zeros([1, 5]))
print(deferred_restore.numpy()) # Not restored; still zeros
fake_layer.kernel = deferred_restore
print(deferred_restore.numpy()) # Restored
[[0. 0. 0. 0. 0.]] [[4.5854754 4.607731 4.649179 4.8474874 5.121 ]]
ম্যানুয়ালি চেকপয়েন্ট পরিদর্শন
tf.train.load_checkpoint
একটি CheckpointReader
প্রদান করে যা চেকপয়েন্ট বিষয়বস্তুতে নিম্ন স্তরের অ্যাক্সেস দেয়। এতে প্রতিটি ভেরিয়েবলের কী থেকে চেকপয়েন্টের প্রতিটি ভেরিয়েবলের আকৃতি এবং টাইপ পর্যন্ত ম্যাপিং রয়েছে। একটি ভেরিয়েবলের কী হল এর অবজেক্ট পাথ, যেমন উপরে প্রদর্শিত গ্রাফে।
reader = tf.train.load_checkpoint('./tf_ckpts/')
shape_from_key = reader.get_variable_to_shape_map()
dtype_from_key = reader.get_variable_to_dtype_map()
sorted(shape_from_key.keys())
['_CHECKPOINTABLE_OBJECT_GRAPH', 'iterator/.ATTRIBUTES/ITERATOR_STATE', 'net/l1/bias/.ATTRIBUTES/VARIABLE_VALUE', 'net/l1/bias/.OPTIMIZER_SLOT/optimizer/m/.ATTRIBUTES/VARIABLE_VALUE', 'net/l1/bias/.OPTIMIZER_SLOT/optimizer/v/.ATTRIBUTES/VARIABLE_VALUE', 'net/l1/kernel/.ATTRIBUTES/VARIABLE_VALUE', 'net/l1/kernel/.OPTIMIZER_SLOT/optimizer/m/.ATTRIBUTES/VARIABLE_VALUE', 'net/l1/kernel/.OPTIMIZER_SLOT/optimizer/v/.ATTRIBUTES/VARIABLE_VALUE', 'optimizer/beta_1/.ATTRIBUTES/VARIABLE_VALUE', 'optimizer/beta_2/.ATTRIBUTES/VARIABLE_VALUE', 'optimizer/decay/.ATTRIBUTES/VARIABLE_VALUE', 'optimizer/iter/.ATTRIBUTES/VARIABLE_VALUE', 'optimizer/learning_rate/.ATTRIBUTES/VARIABLE_VALUE', 'save_counter/.ATTRIBUTES/VARIABLE_VALUE', 'step/.ATTRIBUTES/VARIABLE_VALUE']
সুতরাং আপনি যদি net.l1.kernel
এর মান সম্পর্কে আগ্রহী হন তবে আপনি নিম্নলিখিত কোডের সাথে মান পেতে পারেন:
key = 'net/l1/kernel/.ATTRIBUTES/VARIABLE_VALUE'
print("Shape:", shape_from_key[key])
print("Dtype:", dtype_from_key[key].name)
Shape: [1, 5] Dtype: float32
এটি একটি get_tensor
পদ্ধতিও প্রদান করে যা আপনাকে একটি ভেরিয়েবলের মান পরিদর্শন করতে দেয়:
reader.get_tensor(key)
array([[4.5854754, 4.607731 , 4.649179 , 4.8474874, 5.121 ]], dtype=float32)
অবজেক্ট ট্র্যাকিং
চেকপয়েন্টগুলি tf.Variable
. ভ্যারিয়েবল অবজেক্টের মানগুলি সংরক্ষণ এবং পুনরুদ্ধার করে যে কোনও পরিবর্তনশীল বা ট্র্যাকযোগ্য বস্তুকে তার একটি বৈশিষ্ট্যে সেট করে "ট্র্যাকিং" করে। একটি সংরক্ষণ চালানোর সময়, ভেরিয়েবলগুলি পৌঁছানো যায় এমন সমস্ত ট্র্যাক করা অবজেক্ট থেকে পুনরাবৃত্তিমূলকভাবে সংগ্রহ করা হয়।
self.l1 = tf.keras.layers.Dense(5)
মতো সরাসরি অ্যাট্রিবিউট অ্যাসাইনমেন্টের মতো, অ্যাট্রিবিউটগুলিতে তালিকা এবং অভিধান অ্যাসাইন করা তাদের বিষয়বস্তু ট্র্যাক করবে।
save = tf.train.Checkpoint()
save.listed = [tf.Variable(1.)]
save.listed.append(tf.Variable(2.))
save.mapped = {'one': save.listed[0]}
save.mapped['two'] = save.listed[1]
save_path = save.save('./tf_list_example')
restore = tf.train.Checkpoint()
v2 = tf.Variable(0.)
assert 0. == v2.numpy() # Not restored yet
restore.mapped = {'two': v2}
restore.restore(save_path)
assert 2. == v2.numpy()
আপনি তালিকা এবং অভিধানের জন্য মোড়ানো বস্তুগুলি লক্ষ্য করতে পারেন। এই মোড়কগুলি অন্তর্নিহিত ডেটা-স্ট্রাকচারের চেকপয়েন্টেবল সংস্করণ। অ্যাট্রিবিউট ভিত্তিক লোডিংয়ের মতোই, এই র্যাপারগুলি কন্টেইনারে যোগ করার সাথে সাথে একটি ভেরিয়েবলের মান পুনরুদ্ধার করে।
restore.listed = []
print(restore.listed) # ListWrapper([])
v1 = tf.Variable(0.)
restore.listed.append(v1) # Restores v1, from restore() in the previous cell
assert 1. == v1.numpy()
ListWrapper([])
ট্র্যাক করা যায় এমন বস্তুর মধ্যে রয়েছে tf.train.Checkpoint
, tf.Module
এবং এর সাবক্লাস (যেমন keras.layers.Layer
এবং keras.Model
), এবং স্বীকৃত পাইথন পাত্রে:
-
dict
(এবংcollections.OrderedDict
। OrderedDict ) -
list
-
tuple
(এবংcollections.namedtuple
,typing.NamedTuple
)
অন্যান্য ধারক প্রকার সমর্থিত নয় , সহ:
-
collections.defaultdict
-
set
অন্যান্য সমস্ত পাইথন বস্তু উপেক্ষা করা হয় , সহ:
-
int
-
string
-
float
সারসংক্ষেপ
TensorFlow অবজেক্টগুলি তাদের ব্যবহার করা ভেরিয়েবলের মানগুলি সংরক্ষণ এবং পুনরুদ্ধার করার জন্য একটি সহজ স্বয়ংক্রিয় প্রক্রিয়া প্রদান করে।