তারিখটা মনে রেখো! গুগল I / O মে 18-20 মে এখনই রেজিস্টার করুন
This page was translated by the Cloud Translation API.
Switch to English

প্রশিক্ষণ চৌকিগুলি

টেনসরফ্লো.অর্গ.এ দেখুন গুগল কোলাবে চালান গিটহাবের উত্স দেখুন নোটবুক ডাউনলোড করুন

"একটি টেনসরফ্লো মডেল সংরক্ষণ করা" বাক্যাংশটির অর্থ সাধারণত দুটি জিনিসের একটি:

  1. চেকপয়েন্টস, ওআর
  2. সেভডমডেল

মডেল দ্বারা ব্যবহৃত সমস্ত পরামিতি ( tf.Variable বস্তু) এর সঠিক মান চেকপয়েন্টগুলি ক্যাপচার করে। মডেল দ্বারা সংজ্ঞায়িত গণনার কোনও বিবরণ চেকপয়েন্টগুলিতে থাকে না এবং এইভাবে সাধারণত তখন কার্যকর হয় যখন সংরক্ষণিত প্যারামিটার মানগুলি ব্যবহার করে এমন সোর্স কোড পাওয়া যায়।

অন্যদিকে সেভডমোডেল বিন্যাসে পরামিতি মানগুলি (চেকপয়েন্ট) ছাড়াও মডেল দ্বারা সংজ্ঞায়িত গণনার ক্রমিক বিবরণ অন্তর্ভুক্ত রয়েছে। এই বিন্যাসে থাকা মডেলগুলি উত্স কোড থেকে স্বতন্ত্র যারা মডেল তৈরি করেছেন। এগুলি টেনসরফ্লো সার্ভিং, টেনসরফ্লো লাইট, টেনসরফ্লো.জেএস, বা অন্যান্য প্রোগ্রামিং ভাষার (সি, সি ++, জাভা, গো, মরিচা, সি # ইত্যাদি টেনসরফ্লো এপিআই) প্রোগ্রামের মাধ্যমে স্থাপনার জন্য উপযুক্ত thus

এই গাইডটিতে চেকপয়েন্টগুলি লেখার এবং পড়ার জন্য এপিআইগুলিকে অন্তর্ভুক্ত করা হয়েছে।

সেটআপ

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 একটি tf.keras.Model.save_weights চেকপয়েন্ট সংরক্ষণ করে।

net.save_weights('easy_checkpoint')

চেকপয়েন্ট লিখছি

tf.Variable মডেলের ক্রমাগত অবস্থা tf.Variable . tf.Variable বস্তুগুলিতে সংরক্ষণ করা হয়। এগুলি সরাসরি নির্মিত যেতে পারে তবে প্রায়শই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.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 30.42
Saved checkpoint for step 20: ./tf_ckpts/ckpt-2
loss 23.83
Saved checkpoint for step 30: ./tf_ckpts/ckpt-3
loss 17.27
Saved checkpoint for step 40: ./tf_ckpts/ckpt-4
loss 10.81
Saved checkpoint for step 50: ./tf_ckpts/ckpt-5
loss 4.74

পুনরুদ্ধার করুন এবং প্রশিক্ষণ চালিয়ে যান

প্রথম প্রশিক্ষণ চক্রের পরে আপনি একটি নতুন মডেল এবং ম্যানেজার পাস করতে পারেন, তবে আপনি যেখানে ছেড়েছিলেন ঠিক সেখানে প্রশিক্ষণ নিতে পারেন:

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 0.85
Saved checkpoint for step 70: ./tf_ckpts/ckpt-7
loss 0.87
Saved checkpoint for step 80: ./tf_ckpts/ckpt-8
loss 0.71
Saved checkpoint for step 90: ./tf_ckpts/ckpt-9
loss 0.46
Saved checkpoint for step 100: ./tf_ckpts/ckpt-10
loss 0.21

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 './tf_ckpts/checkpoint' তার রাজ্য সংরক্ষণ করে।

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

মেকানিক্স লোড হচ্ছে

টেনসরফ্লো বস্তুটি লোড হওয়া থেকে শুরু করে নামের প্রান্তগুলির সাথে নির্দেশিত গ্রাফটি ট্র্যাভার করে ভেরিয়েবলগুলি চেকপেন্ডেড মানগুলির সাথে মেলে। প্রান্তের নামগুলি সাধারণত অবজেক্টগুলিতে বৈশিষ্ট্যযুক্ত নাম থেকে আসে, উদাহরণস্বরূপ self.l1 = tf.keras.layers.Dense(5) "l1" self.l1 = tf.keras.layers.Dense(5) "l1"tf.train.Checkpoint তার কীওয়ার্ড আর্গুমেন্টের নামগুলি ব্যবহার করে, যেমন tf.train.Checkpoint(step=...) এর "step"

উপরের উদাহরণ থেকে নির্ভরতা গ্রাফটি এমন দেখাচ্ছে:

উদাহরণস্বরূপ প্রশিক্ষণ লুপের জন্য নির্ভরতা গ্রাফের ভিজ্যুয়ালাইজেশন

অপ্টিমাইজারটি লাল রঙের, নিয়মিত ভেরিয়েবলগুলি নীল এবং অপ্টিমাইজার স্লট ভেরিয়েবল কমলা রঙের হয়। অন্যান্য নোড example উদাহরণস্বরূপ, কালো 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.831489  3.7156947 2.5892444 3.8669944 4.749503 ]

এই নতুন অবজেক্টের জন্য নির্ভরতা গ্রাফটি আপনি উপরে যে বৃহত্তর চেকপয়েন্টটি লিখেছেন তার চেয়ে অনেক ছোট সাবগ্রাফ্ট। tf.train.Checkpoint কেবল পক্ষপাত এবং একটি সংরক্ষণের কাউন্টার অন্তর্ভুক্ত রয়েছে যা চেকপয়েন্টগুলিকে নম্বর tf.train.Checkpoint জন্য tf.train.Checkpoint ব্যবহার করে।

বায়াস ভেরিয়েবলের জন্য একটি সাবগ্রাফের ভিজুয়ালাইজেশন

restore একটি স্থিতি বস্তু, যা alচ্ছিক প্রতিস্থাপন আছে ফিরে দেয়। নতুন Checkpoint তৈরি সমস্ত বস্তু পুনরুদ্ধার করা হয়েছে, সুতরাং status.assert_existing_objects_matched পাস।

status.assert_existing_objects_matched()
<tensorflow.python.training.tracking.util.CheckpointLoadStatus at 0x7f1644447b70>

চেকপয়েন্টে অনেকগুলি অবজেক্ট রয়েছে যা স্তরের কার্নেল এবং অপ্টিমাইজারের ভেরিয়েবলগুলি সহ মেলে না। status.assert_consumed এবং প্রোগ্রামটি হুবহু মিলে গেলে status.assert_consumed কেবল পাস হয় এবং এখানে একটি ব্যতিক্রম ছুঁড়ে ফেলা হবে।

বিলম্বিত পুনরুদ্ধার

টেন্সরফ্লোতে Layer অবজেক্টগুলি যখন ইনপুট আকারগুলি উপলব্ধ থাকে তখন তাদের প্রথম কলটিতে ভেরিয়েবলগুলি তৈরি করতে বিলম্ব হতে পারে। উদাহরণস্বরূপ একটি Dense স্তরের কার্নেলের আকৃতি স্তরটির ইনপুট এবং আউটপুট উভয় আকারের উপর নির্ভর করে এবং সুতরাং কনস্ট্রাক্টর আর্গুমেন্ট হিসাবে প্রয়োজনীয় আউটপুট আকারটি তার নিজের উপর ভেরিয়েবলটি তৈরি করতে পর্যাপ্ত তথ্য নয়। যেহেতু একটি Layer কল করাও ভেরিয়েবলের মান পড়ে, তাই পরিবর্তনশীলটির তৈরি এবং এটির প্রথম ব্যবহারের মধ্যে একটি পুনরুদ্ধার অবশ্যই ঘটে।

এই tf.train.Checkpoint সমর্থন করার জন্য, tf.train.Checkpoint সারিগুলি পুনরুদ্ধার করে যার মধ্যে এখনও কোনও ম্যাচিং ভেরিয়েবল নেই।

delayed_restore = tf.Variable(tf.zeros([1, 5]))
print(delayed_restore.numpy())  # Not restored; still zeros
fake_layer.kernel = delayed_restore
print(delayed_restore.numpy())  # Restored
[[0. 0. 0. 0. 0.]]
[[4.5719748 4.6099544 4.931875  4.836442  4.8496275]]

ম্যানুয়ালি চেকপয়েন্টগুলি পরিদর্শন করা হচ্ছে

tf.train.load_checkpoint একটি CheckpointReader tf.train.load_checkpoint প্রদান করে যা CheckpointReader tf.train.load_checkpoint নিম্ন স্তরের অ্যাক্সেস দেয়। এটিতে প্রতিটি ভেরিয়েবলের কী থেকে ম্যাপিংস থাকে, চেকপয়েন্টে প্রতিটি ভেরিয়েবলের জন্য আকৃতি এবং টাইপ করা যায়। উপরের প্রদর্শিত গ্রাফগুলির মতো একটি ভেরিয়েবলের কী এটির অবজেক্ট পাথ।

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.5719748, 4.6099544, 4.931875 , 4.836442 , 4.8496275]],
      dtype=float32)

তালিকা এবং অভিধান ট্র্যাকিং

self.l1 = tf.keras.layers.Dense(5) মতো প্রত্যক্ষ বৈশিষ্ট্যযুক্ত 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.keras.Model সাবক্লাসে প্রয়োগ করা হয় এবং স্তরগুলির তালিকাগুলি ট্র্যাক করার জন্য এটি ব্যবহৃত হতে পারে।

সারসংক্ষেপ

টেনসরফ্লো অবজেক্টগুলি তারা ব্যবহার করে ভেরিয়েবলের মান সংরক্ষণ এবং পুনরুদ্ধারের জন্য একটি সহজ স্বয়ংক্রিয় প্রক্রিয়া সরবরাহ করে।