بازرسی های آموزشی

مشاهده در TensorFlow.org در Google Colab اجرا کنید مشاهده منبع در GitHub دانلود دفترچه یادداشت

عبارت "صرفه جویی در مدل TensorFlow" به طور معمول به یکی از دو مورد اشاره می کند:

  1. نقاط بازرسی ، OR
  2. مدل ذخیره شده

ترجمه نمی این ضبط مقدار دقیق از تمام پارامترهای ( tf.Variable اشیاء) استفاده شده توسط یک مدل. چک پوینت ها هیچ توضیحی در مورد محاسبه تعریف شده توسط مدل ندارند و بنابراین معمولاً تنها زمانی مفید هستند که کد منبع که از مقادیر پارامتر ذخیره شده استفاده می کند در دسترس باشد.

قالب SavedModel از طرف دیگر شامل توصیف سریالی محاسبه تعریف شده توسط مدل علاوه بر مقادیر پارامتر (نقطه بازرسی) است. مدلهای این قالب مستقل از کد منبع ایجاد کننده مدل هستند. بنابراین آنها برای استقرار از طریق TensorFlow Serving ، TensorFlow Lite ، TensorFlow.js یا برنامه های دیگر زبان های برنامه نویسی (API های C ، C ++ ، جاوا ، Go ، Rust ، C# و غیره TensorFlow) مناسب هستند.

این راهنما 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 رابط های برنامه کاربردی آموزش

مشاهده tf.keras راهنمایی در صرفه جویی و بازگرداندن.

tf.keras.Model.save_weights موجب صرفه جویی در یک ایستگاه بازرسی TensorFlow.

net.save_weights('easy_checkpoint')

نوشتن ایست بازرسی

دولت مداوم از یک مدل TensorFlow در ذخیره شده tf.Variable اشیاء. این را می توان به طور مستقیم ساخته شده، اما اغلب از طریق API های سطح بالا مانند ایجاد tf.keras.layers یا tf.keras.Model .

ساده ترین راه برای مدیریت متغیرها این است که آنها را به اشیاء Python متصل کرده و سپس به آن اشیاء مراجعه کنید.

مشتق شده از 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 29.67
Saved checkpoint for step 20: ./tf_ckpts/ckpt-2
loss 23.09
Saved checkpoint for step 30: ./tf_ckpts/ckpt-3
loss 16.53
Saved checkpoint for step 40: ./tf_ckpts/ckpt-4
loss 10.10
Saved checkpoint for step 50: ./tf_ckpts/ckpt-5
loss 4.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 0.64
Saved checkpoint for step 70: ./tf_ckpts/ckpt-7
loss 1.17
Saved checkpoint for step 80: ./tf_ckpts/ckpt-8
loss 0.69
Saved checkpoint for step 90: ./tf_ckpts/ckpt-9
loss 0.34
Saved checkpoint for step 100: ./tf_ckpts/ckpt-10
loss 0.19

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 در سیاه و سفید مختلط شده اند.

متغیرهای شکاف بخشی از حالت بهینه ساز هستند ، اما برای یک متغیر خاص ایجاد شده اند. به عنوان مثال '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.3119967 2.088805  3.9098527 3.9504364 4.7226586]

نمودار وابستگی برای این اشیاء جدید زیرگراف کوچکتر از بازرسی بزرگتری است که در بالا نوشتید. این شامل تنها تعصب و یک صرفه جویی شمارنده است که tf.train.Checkpoint با استفاده از به پست های بازرسی تعداد.

تجسم یک زیرگراف برای متغیر بایاس

restore بازده یک شی وضعیت، که اظهارات اختیاری است. همه اشیاء در جدید ایجاد Checkpoint بازیابی شده است، به طوری که status.assert_existing_objects_matched عبور می کند.

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

اشیاء زیادی در ایست بازرسی وجود دارد که با هم مطابقت ندارند ، از جمله هسته لایه و متغیرهای بهینه ساز. 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.603108  4.814235  4.7161555 4.818163  4.8451676]]

بازرسی دستی ایست های بازرسی

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.603108 , 4.814235 , 4.7161555, 4.818163 , 4.8451676]],
      dtype=float32)

فهرست و ردیابی فرهنگ لغت

همانطور که با تکالیف مستقیم ویژگی مانند 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 ، و ممکن است برای مثال با استفاده از فهرست ها از لایه ها.

خلاصه

اشیاء TensorFlow یک مکانیسم خودکار آسان برای ذخیره و بازیابی مقادیر متغیرهایی که استفاده می کنند ، ارائه می دهند.