مساعدة في حماية الحاجز المرجاني العظيم مع TensorFlow على Kaggle تاريخ التحدي

فعالية Tensorflow 2

عرض على TensorFlow.org تشغيل في Google Colab عرض على جيثب تحميل دفتر

ملخص

يوفر هذا الدليل قائمة بأفضل الممارسات لكتابة التعليمات البرمجية باستخدام TensorFlow 2 (TF2). الرجوع إلى قسم الهجرة من الدليل لمزيد من المعلومات عن الهجرة كود TF1.x لTF2.

اقامة

قم باستيراد TensorFlow والتبعيات الأخرى للأمثلة الواردة في هذا الدليل.

import tensorflow as tf
import tensorflow_datasets as tfds

توصيات TensorFlow الاصطلاحية 2

أعد بناء الكود الخاص بك إلى وحدات أصغر

من الممارسات الجيدة إعادة تشكيل الكود الخاص بك إلى وظائف أصغر يتم استدعاؤها حسب الحاجة. للحصول على أفضل أداء، يجب أن تحاول تزيين أكبر كتل من حساب ما تستطيع في tf.function (علما بأن وظائف الثعبان المتداخلة والتي دعا لها tf.function لا تتطلب ديكورات منفصلة خاصة بها، إلا إذا كنت ترغب في استخدام مختلف jit_compile إعدادات tf.function ). اعتمادًا على حالة الاستخدام الخاصة بك ، قد تكون هذه خطوات تدريب متعددة أو حتى حلقة التدريب بأكملها. بالنسبة لحالات استخدام الاستدلال ، قد يكون نموذجًا واحدًا تمريرة للأمام.

ضبط معدل التعلم الافتراضي لبعض tf.keras.optimizer الصورة

بعض محسّني Keras لديهم معدلات تعلم مختلفة في TF2. إذا رأيت تغييرًا في سلوك التقارب لنماذجك ، فتحقق من معدلات التعلم الافتراضية.

لا توجد أية تغييرات ل optimizers.SGD ، optimizers.Adam ، أو optimizers.RMSprop .

تغيرت معدلات التعلم الافتراضية التالية:

استخدام tf.Module الصورة وطبقات Keras لإدارة المتغيرات

tf.Module الصورة و tf.keras.layers.Layer الصورة العرض ومريحة variables و trainable_variables الخصائص، التي تجمع بشكل متكرر لكافة المتغيرات التابعة. هذا يجعل من السهل إدارة المتغيرات محليًا إلى حيث يتم استخدامها.

طبقات Keras / نماذج ترث من tf.train.Checkpointable وتتكامل مع @tf.function ، مما يجعل من الممكن لنقطة تفتيش مباشرة أو SavedModels التصدير من الكائنات Keras. لم يكن لديك بالضرورة لاستخدام Keras " Model.fit API للاستفادة من هذه التكامل.

قراءة المقطع على التعلم نقل وصقل في دليل Keras لمعرفة كيفية جمع مجموعة فرعية من المتغيرات ذات الصلة باستخدام Keras.

الجمع بين tf.data.Dataset الصورة و tf.function

و TensorFlow مجموعات البيانات الحزمة ( tfds ) يحتوي على مرافق لتحميل قواعد البيانات مسبقا كما tf.data.Dataset الكائنات. على سبيل المثال، يمكنك تحميل بيانات MNIST باستخدام tfds :

datasets, info = tfds.load(name='mnist', with_info=True, as_supervised=True)
mnist_train, mnist_test = datasets['train'], datasets['test']

ثم قم بإعداد البيانات للتدريب:

  • أعد قياس كل صورة.
  • تبديل ترتيب الأمثلة عشوائيًا.
  • اجمع دفعات من الصور والتسميات.
BUFFER_SIZE = 10 # Use a much larger value for real code
BATCH_SIZE = 64
NUM_EPOCHS = 5


def scale(image, label):
  image = tf.cast(image, tf.float32)
  image /= 255

  return image, label

للإبقاء على المثال قصيرًا ، قم بقص مجموعة البيانات لإرجاع 5 دفعات فقط:

train_data = mnist_train.map(scale).shuffle(BUFFER_SIZE).batch(BATCH_SIZE)
test_data = mnist_test.map(scale).batch(BATCH_SIZE)

STEPS_PER_EPOCH = 5

train_data = train_data.take(STEPS_PER_EPOCH)
test_data = test_data.take(STEPS_PER_EPOCH)
image_batch, label_batch = next(iter(train_data))
2021-09-22 22:13:17.284138: W tensorflow/core/kernels/data/cache_dataset_ops.cc:768] The calling iterator did not fully read the dataset being cached. In order to avoid unexpected truncation of the dataset, the partially cached contents of the dataset  will be discarded. This can happen if you have an input pipeline similar to `dataset.cache().take(k).repeat()`. You should use `dataset.take(k).cache().repeat()` instead.

استخدم تكرار Python المعتاد للتكرار على بيانات التدريب التي تناسب الذاكرة. خلاف ذلك، tf.data.Dataset هو أفضل وسيلة لعرض البيانات من القرص التدريب. قواعد البيانات هي iterables (لا التكرارات) ، والعمل تماما مثل iterables بيثون الأخرى في تنفيذ متحمسين. يمكنك الاستفادة الكاملة من مجموعة البيانات المتزامن الجلب المسبق / تدفق ملامح التفاف التعليمات البرمجية في tf.function ، الذي يحل محل بيثون التكرار مع عمليات الرسم البياني تعادل باستخدام توقيعه.

@tf.function
def train(model, dataset, optimizer):
  for x, y in dataset:
    with tf.GradientTape() as tape:
      # training=True is only needed if there are layers with different
      # behavior during training versus inference (e.g. Dropout).
      prediction = model(x, training=True)
      loss = loss_fn(prediction, y)
    gradients = tape.gradient(loss, model.trainable_variables)
    optimizer.apply_gradients(zip(gradients, model.trainable_variables))

إذا كنت تستخدم Keras Model.fit API، سوف لا يكون لديك ما يدعو للقلق بيانات التكرار.

model.compile(optimizer=optimizer, loss=loss_fn)
model.fit(dataset)

استخدم حلقات تدريب Keras

إذا كنت لا تحتاج إلى ضبط مستوى أدنى من عملية التدريب الخاص بك، وذلك باستخدام Keras "المدمج في fit ، evaluate ، و predict الأساليب الموصى بها. توفر هذه الطرق واجهة موحدة لتدريب النموذج بغض النظر عن التنفيذ (متسلسل أو وظيفي أو مصنف فرعي).

تشمل مزايا هذه الطرق ما يلي:

  • انهم يقبلون صفائف نمباي، مولدات بيثون و، tf.data.Datasets .
  • يطبقون التنظيم وخسائر التنشيط تلقائيًا.
  • أنها تدعم tf.distribute حيث لا يزال رمز التدريب نفسها بغض النظر عن تكوين الأجهزة .
  • أنها تدعم الاستدعاء التعسفي كخسائر ومقاييس.
  • أنها تدعم الاسترجاعات مثل tf.keras.callbacks.TensorBoard ، والاسترجاعات المخصصة.
  • إنها فعالة ، وتستخدم تلقائيًا الرسوم البيانية TensorFlow.

هنا مثال على تدريب نموذج باستخدام Dataset . للحصول على تفاصيل حول كيفية عمل ذلك، وتحقق من الدروس .

model = tf.keras.Sequential([
    tf.keras.layers.Conv2D(32, 3, activation='relu',
                           kernel_regularizer=tf.keras.regularizers.l2(0.02),
                           input_shape=(28, 28, 1)),
    tf.keras.layers.MaxPooling2D(),
    tf.keras.layers.Flatten(),
    tf.keras.layers.Dropout(0.1),
    tf.keras.layers.Dense(64, activation='relu'),
    tf.keras.layers.BatchNormalization(),
    tf.keras.layers.Dense(10)
])

# Model is the full model w/o custom layers
model.compile(optimizer='adam',
              loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
              metrics=['accuracy'])

model.fit(train_data, epochs=NUM_EPOCHS)
loss, acc = model.evaluate(test_data)

print("Loss {}, Accuracy {}".format(loss, acc))
Epoch 1/5
5/5 [==============================] - 9s 9ms/step - loss: 1.5774 - accuracy: 0.5063
Epoch 2/5
2021-09-22 22:13:26.932626: W tensorflow/core/kernels/data/cache_dataset_ops.cc:768] The calling iterator did not fully read the dataset being cached. In order to avoid unexpected truncation of the dataset, the partially cached contents of the dataset  will be discarded. This can happen if you have an input pipeline similar to `dataset.cache().take(k).repeat()`. You should use `dataset.take(k).cache().repeat()` instead.
5/5 [==============================] - 0s 5ms/step - loss: 0.4498 - accuracy: 0.9125
Epoch 3/5
2021-09-22 22:13:27.323101: W tensorflow/core/kernels/data/cache_dataset_ops.cc:768] The calling iterator did not fully read the dataset being cached. In order to avoid unexpected truncation of the dataset, the partially cached contents of the dataset  will be discarded. This can happen if you have an input pipeline similar to `dataset.cache().take(k).repeat()`. You should use `dataset.take(k).cache().repeat()` instead.
5/5 [==============================] - 0s 5ms/step - loss: 0.2929 - accuracy: 0.9563
Epoch 4/5
2021-09-22 22:13:27.717803: W tensorflow/core/kernels/data/cache_dataset_ops.cc:768] The calling iterator did not fully read the dataset being cached. In order to avoid unexpected truncation of the dataset, the partially cached contents of the dataset  will be discarded. This can happen if you have an input pipeline similar to `dataset.cache().take(k).repeat()`. You should use `dataset.take(k).cache().repeat()` instead.
5/5 [==============================] - 0s 5ms/step - loss: 0.2055 - accuracy: 0.9875
Epoch 5/5
2021-09-22 22:13:28.088985: W tensorflow/core/kernels/data/cache_dataset_ops.cc:768] The calling iterator did not fully read the dataset being cached. In order to avoid unexpected truncation of the dataset, the partially cached contents of the dataset  will be discarded. This can happen if you have an input pipeline similar to `dataset.cache().take(k).repeat()`. You should use `dataset.take(k).cache().repeat()` instead.
5/5 [==============================] - 0s 5ms/step - loss: 0.1669 - accuracy: 0.9937
2021-09-22 22:13:28.458529: W tensorflow/core/kernels/data/cache_dataset_ops.cc:768] The calling iterator did not fully read the dataset being cached. In order to avoid unexpected truncation of the dataset, the partially cached contents of the dataset  will be discarded. This can happen if you have an input pipeline similar to `dataset.cache().take(k).repeat()`. You should use `dataset.take(k).cache().repeat()` instead.
5/5 [==============================] - 0s 3ms/step - loss: 1.6056 - accuracy: 0.6500
Loss 1.6056102514266968, Accuracy 0.6499999761581421
2021-09-22 22:13:28.956635: W tensorflow/core/kernels/data/cache_dataset_ops.cc:768] The calling iterator did not fully read the dataset being cached. In order to avoid unexpected truncation of the dataset, the partially cached contents of the dataset  will be discarded. This can happen if you have an input pipeline similar to `dataset.cache().take(k).repeat()`. You should use `dataset.take(k).cache().repeat()` instead.

خصص التدريب واكتب الحلقة الخاصة بك

إذا كانت نماذج Keras تعمل من أجلك ، ولكنك تحتاج إلى مزيد من المرونة والتحكم في خطوة التدريب أو حلقات التدريب الخارجية ، فيمكنك تنفيذ خطوات التدريب الخاصة بك أو حتى حلقات التدريب بالكامل. راجع دليل Keras على تخصيص fit لمعرفة المزيد.

يمكنك أيضا تنفيذ أشياء كثيرة باعتباره tf.keras.callbacks.Callback .

هذا الأسلوب له العديد من المزايا التي سبق ذكرها ، ولكن يمنحك السيطرة الخطوة القطار وحتى الحلقة الخارجية.

هناك ثلاث خطوات لحلقة التدريب القياسية:

  1. أعاد أكثر من مولد بيثون أو tf.data.Dataset للحصول على دفعات من الأمثلة.
  2. استخدام tf.GradientTape إلى التدرجات جمع.
  3. استخدم إحدى tf.keras.optimizers تطبيق التحديثات الوزن للمتغيرات النموذج.

تذكر:

  • يشمل دائما training الحجة على call طريقة طبقات subclassed والنماذج.
  • تأكد من استدعاء نموذج مع training مجموعة حجة بشكل صحيح.
  • اعتمادًا على الاستخدام ، قد لا توجد متغيرات النموذج حتى يتم تشغيل النموذج على دفعة من البيانات.
  • تحتاج إلى التعامل يدويًا مع أشياء مثل خسائر التنظيم للنموذج.

ليست هناك حاجة لتشغيل مُهيِّئات متغيرة أو لإضافة تبعيات تحكم يدوي. tf.function يعالج تبعيات التحكم الآلي والتهيئة متغير على خلق لك.

model = tf.keras.Sequential([
    tf.keras.layers.Conv2D(32, 3, activation='relu',
                           kernel_regularizer=tf.keras.regularizers.l2(0.02),
                           input_shape=(28, 28, 1)),
    tf.keras.layers.MaxPooling2D(),
    tf.keras.layers.Flatten(),
    tf.keras.layers.Dropout(0.1),
    tf.keras.layers.Dense(64, activation='relu'),
    tf.keras.layers.BatchNormalization(),
    tf.keras.layers.Dense(10)
])

optimizer = tf.keras.optimizers.Adam(0.001)
loss_fn = tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True)

@tf.function
def train_step(inputs, labels):
  with tf.GradientTape() as tape:
    predictions = model(inputs, training=True)
    regularization_loss=tf.math.add_n(model.losses)
    pred_loss=loss_fn(labels, predictions)
    total_loss=pred_loss + regularization_loss

  gradients = tape.gradient(total_loss, model.trainable_variables)
  optimizer.apply_gradients(zip(gradients, model.trainable_variables))

for epoch in range(NUM_EPOCHS):
  for inputs, labels in train_data:
    train_step(inputs, labels)
  print("Finished epoch", epoch)
2021-09-22 22:13:29.878252: W tensorflow/core/kernels/data/cache_dataset_ops.cc:768] The calling iterator did not fully read the dataset being cached. In order to avoid unexpected truncation of the dataset, the partially cached contents of the dataset  will be discarded. This can happen if you have an input pipeline similar to `dataset.cache().take(k).repeat()`. You should use `dataset.take(k).cache().repeat()` instead.
Finished epoch 0
2021-09-22 22:13:30.266807: W tensorflow/core/kernels/data/cache_dataset_ops.cc:768] The calling iterator did not fully read the dataset being cached. In order to avoid unexpected truncation of the dataset, the partially cached contents of the dataset  will be discarded. This can happen if you have an input pipeline similar to `dataset.cache().take(k).repeat()`. You should use `dataset.take(k).cache().repeat()` instead.
Finished epoch 1
2021-09-22 22:13:30.626589: W tensorflow/core/kernels/data/cache_dataset_ops.cc:768] The calling iterator did not fully read the dataset being cached. In order to avoid unexpected truncation of the dataset, the partially cached contents of the dataset  will be discarded. This can happen if you have an input pipeline similar to `dataset.cache().take(k).repeat()`. You should use `dataset.take(k).cache().repeat()` instead.
Finished epoch 2
2021-09-22 22:13:31.040058: W tensorflow/core/kernels/data/cache_dataset_ops.cc:768] The calling iterator did not fully read the dataset being cached. In order to avoid unexpected truncation of the dataset, the partially cached contents of the dataset  will be discarded. This can happen if you have an input pipeline similar to `dataset.cache().take(k).repeat()`. You should use `dataset.take(k).cache().repeat()` instead.
Finished epoch 3
Finished epoch 4
2021-09-22 22:13:31.417637: W tensorflow/core/kernels/data/cache_dataset_ops.cc:768] The calling iterator did not fully read the dataset being cached. In order to avoid unexpected truncation of the dataset, the partially cached contents of the dataset  will be discarded. This can happen if you have an input pipeline similar to `dataset.cache().take(k).repeat()`. You should use `dataset.take(k).cache().repeat()` instead.

الاستفادة من tf.function مع التحكم في التدفق بيثون

tf.function يوفر وسيلة لتحويل التحكم في التدفق تعتمد البيانات في حكمه الرسم البياني وضع مثل tf.cond و tf.while_loop .

أحد الأماكن الشائعة حيث يظهر تدفق التحكم المعتمد على البيانات هو نماذج التسلسل. tf.keras.layers.RNN يلتف خلية RNN، مما يتيح لك إما ثابت أو حيوي انبسط تكرار. على سبيل المثال ، يمكنك إعادة تطبيق ميزة إلغاء التسجيل الديناميكي على النحو التالي.

class DynamicRNN(tf.keras.Model):

  def __init__(self, rnn_cell):
    super(DynamicRNN, self).__init__(self)
    self.cell = rnn_cell

  @tf.function(input_signature=[tf.TensorSpec(dtype=tf.float32, shape=[None, None, 3])])
  def call(self, input_data):

    # [batch, time, features] -> [time, batch, features]
    input_data = tf.transpose(input_data, [1, 0, 2])
    timesteps =  tf.shape(input_data)[0]
    batch_size = tf.shape(input_data)[1]
    outputs = tf.TensorArray(tf.float32, timesteps)
    state = self.cell.get_initial_state(batch_size = batch_size, dtype=tf.float32)
    for i in tf.range(timesteps):
      output, state = self.cell(input_data[i], state)
      outputs = outputs.write(i, output)
    return tf.transpose(outputs.stack(), [1, 0, 2]), state
lstm_cell = tf.keras.layers.LSTMCell(units = 13)

my_rnn = DynamicRNN(lstm_cell)
outputs, state = my_rnn(tf.random.normal(shape=[10,20,3]))
print(outputs.shape)
(10, 20, 13)

قراءة tf.function دليل لمزيد من المعلومات.

المقاييس والخسائر بأسلوب جديد

المقاييس والخسائر على حد سواء تعترض هذا العمل بشغف وفي tf.function الصورة.

كائن الخسارة للاستدعاء، وتتوقع ( y_true ، y_pred ) كوسائط:

cce = tf.keras.losses.CategoricalCrossentropy(from_logits=True)
cce([[1, 0]], [[-1.0,3.0]]).numpy()
4.01815

استخدم المقاييس لجمع البيانات وعرضها

يمكنك استخدام tf.metrics لتجميع البيانات و tf.summary لتسجيل ملخصات وتوجيهها إلى الكاتب باستخدام مدير السياق. وتنبعث الملخصات مباشرة إلى الكاتب الذي يعني أنه يجب توفير step قيمة في callsite.

summary_writer = tf.summary.create_file_writer('/tmp/summaries')
with summary_writer.as_default():
  tf.summary.scalar('loss', 0.1, step=42)

استخدام tf.metrics لتجميع البيانات قبل الدخول عليهم كما ملخصات. المقاييس ذات الحالة ؛ تتراكم القيم وإرجاع النتيجة التراكمية عند استدعاء result طريقة (مثل Mean.result ). واضح المتراكمة القيم مع Model.reset_states .

def train(model, optimizer, dataset, log_freq=10):
  avg_loss = tf.keras.metrics.Mean(name='loss', dtype=tf.float32)
  for images, labels in dataset:
    loss = train_step(model, optimizer, images, labels)
    avg_loss.update_state(loss)
    if tf.equal(optimizer.iterations % log_freq, 0):
      tf.summary.scalar('loss', avg_loss.result(), step=optimizer.iterations)
      avg_loss.reset_states()

def test(model, test_x, test_y, step_num):
  # training=False is only needed if there are layers with different
  # behavior during training versus inference (e.g. Dropout).
  loss = loss_fn(model(test_x, training=False), test_y)
  tf.summary.scalar('loss', loss, step=step_num)

train_summary_writer = tf.summary.create_file_writer('/tmp/summaries/train')
test_summary_writer = tf.summary.create_file_writer('/tmp/summaries/test')

with train_summary_writer.as_default():
  train(model, optimizer, dataset)

with test_summary_writer.as_default():
  test(model, test_x, test_y, optimizer.iterations)

تصور الملخصات التي تم إنشاؤها عن طريق توجيه TensorBoard إلى دليل السجل الموجز:

tensorboard --logdir /tmp/summaries

استخدام tf.summary API لبيانات ملخص الكتابة عن التصور في TensorBoard. لمزيد من المعلومات، يرجى قراءة tf.summary دليل .

# Create the metrics
loss_metric = tf.keras.metrics.Mean(name='train_loss')
accuracy_metric = tf.keras.metrics.SparseCategoricalAccuracy(name='train_accuracy')

@tf.function
def train_step(inputs, labels):
  with tf.GradientTape() as tape:
    predictions = model(inputs, training=True)
    regularization_loss=tf.math.add_n(model.losses)
    pred_loss=loss_fn(labels, predictions)
    total_loss=pred_loss + regularization_loss

  gradients = tape.gradient(total_loss, model.trainable_variables)
  optimizer.apply_gradients(zip(gradients, model.trainable_variables))
  # Update the metrics
  loss_metric.update_state(total_loss)
  accuracy_metric.update_state(labels, predictions)


for epoch in range(NUM_EPOCHS):
  # Reset the metrics
  loss_metric.reset_states()
  accuracy_metric.reset_states()

  for inputs, labels in train_data:
    train_step(inputs, labels)
  # Get the metric results
  mean_loss=loss_metric.result()
  mean_accuracy = accuracy_metric.result()

  print('Epoch: ', epoch)
  print('  loss:     {:.3f}'.format(mean_loss))
  print('  accuracy: {:.3f}'.format(mean_accuracy))
2021-09-22 22:13:32.370558: W tensorflow/core/kernels/data/cache_dataset_ops.cc:768] The calling iterator did not fully read the dataset being cached. In order to avoid unexpected truncation of the dataset, the partially cached contents of the dataset  will be discarded. This can happen if you have an input pipeline similar to `dataset.cache().take(k).repeat()`. You should use `dataset.take(k).cache().repeat()` instead.
Epoch:  0
  loss:     0.143
  accuracy: 0.997
2021-09-22 22:13:32.752675: W tensorflow/core/kernels/data/cache_dataset_ops.cc:768] The calling iterator did not fully read the dataset being cached. In order to avoid unexpected truncation of the dataset, the partially cached contents of the dataset  will be discarded. This can happen if you have an input pipeline similar to `dataset.cache().take(k).repeat()`. You should use `dataset.take(k).cache().repeat()` instead.
Epoch:  1
  loss:     0.119
  accuracy: 0.997
2021-09-22 22:13:33.122889: W tensorflow/core/kernels/data/cache_dataset_ops.cc:768] The calling iterator did not fully read the dataset being cached. In order to avoid unexpected truncation of the dataset, the partially cached contents of the dataset  will be discarded. This can happen if you have an input pipeline similar to `dataset.cache().take(k).repeat()`. You should use `dataset.take(k).cache().repeat()` instead.
Epoch:  2
  loss:     0.106
  accuracy: 0.997
2021-09-22 22:13:33.522935: W tensorflow/core/kernels/data/cache_dataset_ops.cc:768] The calling iterator did not fully read the dataset being cached. In order to avoid unexpected truncation of the dataset, the partially cached contents of the dataset  will be discarded. This can happen if you have an input pipeline similar to `dataset.cache().take(k).repeat()`. You should use `dataset.take(k).cache().repeat()` instead.
Epoch:  3
  loss:     0.089
  accuracy: 1.000
Epoch:  4
  loss:     0.079
  accuracy: 1.000
2021-09-22 22:13:33.899024: W tensorflow/core/kernels/data/cache_dataset_ops.cc:768] The calling iterator did not fully read the dataset being cached. In order to avoid unexpected truncation of the dataset, the partially cached contents of the dataset  will be discarded. This can happen if you have an input pipeline similar to `dataset.cache().take(k).repeat()`. You should use `dataset.take(k).cache().repeat()` instead.

أسماء مترية Keras

نماذج Keras متسقة بشأن التعامل مع الأسماء المترية. عند تمرير سلسلة في قائمة المقاييس، يتم استخدام هذه السلسلة بالضبط كما المتري في name . هذه الأسماء هي واضحة في وجوه التاريخ إرجاعها بواسطة model.fit ، وفي سجلات مرت إلى keras.callbacks . تم تعيينه على السلسلة التي مررتها في قائمة المقاييس.

model.compile(
    optimizer = tf.keras.optimizers.Adam(0.001),
    loss = tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
    metrics = ['acc', 'accuracy', tf.keras.metrics.SparseCategoricalAccuracy(name="my_accuracy")])
history = model.fit(train_data)
5/5 [==============================] - 1s 5ms/step - loss: 0.0962 - acc: 0.9969 - accuracy: 0.9969 - my_accuracy: 0.9969
2021-09-22 22:13:34.802566: W tensorflow/core/kernels/data/cache_dataset_ops.cc:768] The calling iterator did not fully read the dataset being cached. In order to avoid unexpected truncation of the dataset, the partially cached contents of the dataset  will be discarded. This can happen if you have an input pipeline similar to `dataset.cache().take(k).repeat()`. You should use `dataset.take(k).cache().repeat()` instead.
history.history.keys()
dict_keys(['loss', 'acc', 'accuracy', 'my_accuracy'])

التصحيح

استخدم التنفيذ الحثيث لتشغيل التعليمات البرمجية خطوة بخطوة لفحص الأشكال وأنواع البيانات والقيم. بعض واجهات برمجة التطبيقات، مثل tf.function ، tf.keras مصممة، وما إلى ذلك استخدام الرسم البياني التنفيذ، على الأداء وقابلية. عند التصحيح، واستخدام tf.config.run_functions_eagerly(True) لاستخدام تنفيذ حريصة داخل هذا الرمز.

على سبيل المثال:

@tf.function
def f(x):
  if x > 0:
    import pdb
    pdb.set_trace()
    x = x + 1
  return x

tf.config.run_functions_eagerly(True)
f(tf.constant(1))
f()
-> x = x + 1
(Pdb) l
  6     @tf.function
  7     def f(x):
  8       if x > 0:
  9         import pdb
 10         pdb.set_trace()
 11  ->     x = x + 1
 12       return x
 13
 14     tf.config.run_functions_eagerly(True)
 15     f(tf.constant(1))
[EOF]

يعمل هذا أيضًا داخل نماذج Keras وواجهات برمجة التطبيقات الأخرى التي تدعم التنفيذ الحثيث:

class CustomModel(tf.keras.models.Model):

  @tf.function
  def call(self, input_data):
    if tf.reduce_mean(input_data) > 0:
      return input_data
    else:
      import pdb
      pdb.set_trace()
      return input_data // 2


tf.config.run_functions_eagerly(True)
model = CustomModel()
model(tf.constant([-2, -4]))
call()
-> return input_data // 2
(Pdb) l
 10         if tf.reduce_mean(input_data) > 0:
 11           return input_data
 12         else:
 13           import pdb
 14           pdb.set_trace()
 15  ->       return input_data // 2
 16
 17
 18     tf.config.run_functions_eagerly(True)
 19     model = CustomModel()
 20     model(tf.constant([-2, -4]))

ملحوظات:

لا تبقي tf.Tensors في الأشياء الخاصة بك

قد الحصول على إنشاء هذه الكائنات موتر إما في tf.function أو في سياق حريصة، وهذه التنسورات تتصرف بشكل مختلف. دائما استخدام tf.Tensor الصورة فقط للقيم وسيطة.

لتتبع الدولة، استخدم tf.Variable الصورة كما هي دائما صالحة للاستعمال من كلا السياقين. قراءة tf.Variable دليل لمعرفة المزيد.

الموارد والقراءات الإضافية

  • قراءة TF2 أدلة و الدروس لمعرفة المزيد حول كيفية استخدام TF2.

  • إذا سبق لك استخدام TF1.x ، فيوصى بشدة بترحيل الرمز الخاص بك إلى TF2. قراءة أدلة الهجرة لمعرفة المزيد.