সাহায্য Kaggle উপর TensorFlow সঙ্গে গ্রেট বেরিয়ার রিফ রক্ষা চ্যালেঞ্জ যোগদান

প্রশিক্ষণ চেকপয়েন্ট

TensorFlow.org-এ দেখুন GitHub-এ উৎস দেখুন নোটবুক ডাউনলোড করুন

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

  1. চেকপয়েন্ট, বা
  2. সংরক্ষিত মডেল।

চেকপয়েন্ট সকল প্যারামিটার (সঠিক মান ক্যাপচার 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 একটি TensorFlow চেকপয়েন্ট পরিমাণ সঞ্চয় হয়।

net.save_weights('easy_checkpoint')

চেকপয়েন্ট লেখা

একটি TensorFlow মডেলের ক্রমাগত রাষ্ট্র মধ্যে সংরক্ষিত হয় tf.Variable বস্তু। এই সরাসরি নির্মাণ করা যেতে পারে, কিন্তু প্রায়ই মত উচ্চ পর্যায়ের API গুলি মাধ্যমে তৈরি করা হয় tf.keras.layers বা tf.keras.Model

ভেরিয়েবলগুলি পরিচালনা করার সবচেয়ে সহজ উপায় হল সেগুলিকে পাইথন অবজেক্টের সাথে সংযুক্ত করা, তারপর সেই বস্তুগুলিকে উল্লেখ করা।

এর উপশ্রেণী 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 30.37
Saved checkpoint for step 20: ./tf_ckpts/ckpt-2
loss 23.79
Saved checkpoint for step 30: ./tf_ckpts/ckpt-3
loss 17.23
Saved checkpoint for step 40: ./tf_ckpts/ckpt-4
loss 10.72
Saved checkpoint for step 50: ./tf_ckpts/ckpt-5
loss 4.44

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

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

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.33
Saved checkpoint for step 70: ./tf_ckpts/ckpt-7
loss 1.02
Saved checkpoint for step 80: ./tf_ckpts/ckpt-8
loss 0.68
Saved checkpoint for step 90: ./tf_ckpts/ckpt-9
loss 0.34
Saved checkpoint for step 100: ./tf_ckpts/ckpt-10
loss 0.16

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

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

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

অপ্টিমাইজারটি লাল, নিয়মিত ভেরিয়েবলগুলি নীল রঙে এবং অপ্টিমাইজার স্লট ভেরিয়েবলগুলি কমলা রঙে৷ অন্যান্য নোড-উদাহরণস্বরূপ, প্রতিনিধিত্বমূলক tf.train.Checkpoint কালো -are।

স্লট ভেরিয়েবলগুলি অপ্টিমাইজারের অবস্থার অংশ, কিন্তু একটি নির্দিষ্ট ভেরিয়েবলের জন্য তৈরি করা হয়। উদাহরণ হিসেবে বলা যায় 'm' ভরবেগ মিলা উপরে প্রান্ত, যা প্রতিটি পরিবর্তনশীল জন্য আদম অপটিমাইজার ট্র্যাক। স্লট ভেরিয়েবল শুধুমাত্র একটি চেকপয়েন্টে সংরক্ষিত হয় যদি ভেরিয়েবল এবং অপ্টিমাইজার উভয়ই সংরক্ষিত হয়, এভাবে ড্যাশড প্রান্তগুলি।

কলিং restore একটি উপর tf.train.Checkpoint বস্তুর সারিগুলি অনুরোধ পুনরুদ্ধারের হিসাবে পরিবর্তনশীল মান পুনরূদ্ধার শীঘ্রই সেখান থেকে একটি মানানসই পাথ হিসাবে, 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.9910686 3.8070676 3.252836  4.277522  3.8073184]

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

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

restore আয় একটি স্থিতি বস্তু, যার ঐচ্ছিক গবেষকেরা হয়েছে। নতুন তৈরি করা অবজেক্টের সমস্ত Checkpoint , পুনরুদ্ধার করা হয়েছে, যাতে status.assert_existing_objects_matched প্রেরণ করা হয়।

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

লেয়ার কার্নেল এবং অপ্টিমাইজারের ভেরিয়েবল সহ চেকপয়েন্টে অনেকগুলি বস্তু রয়েছে যা মেলেনি। status.assert_consumed শুধুমাত্র থাকে তাহলে চেকপয়েন্ট এবং প্রোগ্রাম ম্যাচ ঠিক, এবং এখানে একটি ব্যতিক্রম নিক্ষেপ করবে।

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

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

এই বাগ্ধারা সমর্থন করার জন্য, 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.5344105 4.5929823 4.7816424 4.758177  5.007635 ]]

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

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.5344105, 4.5929823, 4.7816424, 4.758177 , 5.007635 ]],
      dtype=float32)

অবজেক্ট ট্র্যাকিং

চেকপয়েন্ট সংরক্ষণ এবং মান পুনরুদ্ধার tf.Variable তার গুণাবলী এক "ট্র্যাকিং" কোনো পরিবর্তনশীল বা trackable বস্তুর সেট অবজেক্ট। একটি সংরক্ষণ চালানোর সময়, ভেরিয়েবলগুলি পৌঁছানো যায় এমন সমস্ত ট্র্যাক করা অবজেক্ট থেকে পুনরাবৃত্তিমূলকভাবে সংগ্রহ করা হয়।

মত সরাসরি অ্যাট্রিবিউট বরাদ্দকরণ সঙ্গে 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([])

Trackable বস্তু অন্তর্ভুক্ত tf.train.Checkpoint , tf.Module এবং তার উপশ্রেণী (যেমন keras.layers.Layer এবং keras.Model ), এবং স্বীকৃত পাইথন পাত্রে:

  • dict (এবং collections.OrderedDict )
  • list
  • tuple (এবং collections.namedtuple , typing.NamedTuple )

অন্যান্য ধারক ধরনের সমর্থিত নয়, যেমন:

  • collections.defaultdict
  • set

অন্যান্য সকল পাইথন বস্তু উপেক্ষা করা হয়, যেমন:

  • int
  • string
  • float

সারসংক্ষেপ

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