لدي سؤال؟ تواصل مع المجتمع في منتدى زيارة منتدى TensorFlow

قم بترحيل كود TensorFlow 1 الخاص بك إلى TensorFlow 2

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

هذا الدليل مخصص لمستخدمي واجهات برمجة تطبيقات TensorFlow منخفضة المستوى. إذا كنت تستخدم واجهات برمجة التطبيقات عالية المستوى ( tf.keras ) ، فقد يكون هناك القليل من الإجراءات أو قد لا يكون هناك أي إجراء تحتاج إلى اتخاذه لجعل شفرتك متوافقة تمامًا مع TensorFlow 2.x:

لا يزال من الممكن تشغيل التعليمات البرمجية 1.x ، غير المعدلة ( باستثناء المساهمات) ، في TensorFlow 2.x:

import tensorflow.compat.v1 as tf
tf.disable_v2_behavior()

ومع ذلك ، لا يتيح لك ذلك الاستفادة من العديد من التحسينات التي تم إجراؤها في TensorFlow 2.x. سيساعدك هذا الدليل على ترقية التعليمات البرمجية الخاصة بك ، مما يجعلها أبسط وأكثر كفاءة وأسهل في الصيانة.

برنامج نصي التحويل التلقائي

الخطوة الأولى ، قبل محاولة تنفيذ التغييرات الموضحة في هذا الدليل ، هي محاولة تشغيل البرنامج النصي للترقية .

سيؤدي هذا إلى تنفيذ تمريرة أولية عند ترقية التعليمات البرمجية الخاصة بك إلى TensorFlow 2.x ولكن لا يمكن جعل الكود الخاص بك اصطلاحيًا إلى الإصدار 2. قد تستمر التعليمات البرمجية الخاصة بك في استخدام نقاط النهاية tf.compat.v1 للوصول إلى العناصر النائبة والجلسات والمجموعات والوظائف الأخرى ذات النمط 1.x.

التغييرات السلوكية على أعلى مستوى

إذا كانت التعليمات البرمجية الخاصة بك تعمل في TensorFlow 2.x باستخدام tf.compat.v1.disable_v2_behavior ، فلا تزال هناك تغييرات سلوكية عالمية قد تحتاج إلى معالجتها. التغييرات الرئيسية هي:

  • تنفيذ حريص ، v1.enable_eager_execution() : أي كود يستخدم tf.Graph ضمنيًا سيفشل. تأكد من التفاف هذا الرمز في سياق with tf.Graph().as_default() .

  • متغيرات الموارد ، v1.enable_resource_variables() : قد تعتمد بعض التعليمات البرمجية على السلوكيات غير الحتمية التي تم تمكينها بواسطة متغيرات المرجع TensorFlow. يتم تأمين متغيرات الموارد أثناء الكتابة إليها ، وبالتالي توفر ضمانات تناسق أكثر سهولة.

    • قد يغير هذا السلوك في حالات الحافة.
    • قد يؤدي هذا إلى إنشاء نسخ إضافية ويمكن أن يكون لها استخدام أعلى للذاكرة.
    • يمكن تعطيل هذا بتمرير use_resource=False إلى tf.Variable constructor.
  • أشكال الموتر ، v1.enable_v2_tensorshape() : TensorFlow 2.x يبسط سلوك أشكال الموتر. بدلاً من t.shape[0].value يمكنك قول t.shape[0] . يجب أن تكون هذه التغييرات صغيرة ومن المنطقي إصلاحها على الفور. راجع قسم TensorShape للحصول على أمثلة.

  • تدفق التحكم ، v1.enable_control_flow_v2() : تم تبسيط تنفيذ التحكم في تدفق TensorFlow 2.x ، وبالتالي ينتج تمثيلات بيانية مختلفة. الرجاء ملف البق لأية قضايا.

قم بإنشاء التعليمات البرمجية لـ TensorFlow 2.x

يستعرض هذا الدليل العديد من الأمثلة على تحويل كود TensorFlow 1.x إلى TensorFlow 2.x. ستتيح هذه التغييرات لشفرتك الاستفادة من تحسينات الأداء واستدعاءات واجهة برمجة التطبيقات المبسطة.

في كل حالة ، يكون النمط هو:

1. استبدل مكالمات v1.Session.run

يجب استبدال كل استدعاء v1.Session.run بوظيفة Python.

  • يصبح feed_dict و v1.placeholder s وسيطات دالة.
  • تصبح fetches القيمة المرجعة للدالة.
  • أثناء التحويل ، يسمح التنفيذ pdb السهل باستخدام أدوات Python القياسية مثل pdb .

بعد ذلك ، أضف أداة tf.function لجعلها تعمل بكفاءة في الرسم البياني. راجع دليل Autograph للحصول على مزيد من المعلومات حول كيفية عمل ذلك.

لاحظ أن:

  • على عكس v1.Session.run ، فإن tf.function لها توقيع إرجاع ثابت وتقوم دائمًا بإرجاع جميع المخرجات. إذا تسبب هذا في مشاكل في الأداء ، فقم بإنشاء وظيفتين منفصلتين.

  • ليست هناك حاجة لـ tf.control_dependencies أو عمليات مشابهة: تتصرف tf.function كما لو تم تشغيلها بالترتيب المكتوب. tf.Variable التخصيصات tf.Variable و tf.assert s ، على سبيل المثال ، يتم تنفيذها تلقائيًا.

يحتوي قسم نماذج التحويل على مثال عملي لعملية التحويل هذه.

2. استخدم كائنات Python لتتبع المتغيرات والخسائر

لا يُنصح بشدة بتتبع المتغيرات المستندة إلى الاسم في TensorFlow 2.x. استخدم كائنات Python لتتبع المتغيرات.

استخدم tf.Variable بدلاً من v1.get_variable .

يجب تحويل كل v1.variable_scope إلى كائن Python. عادةً ما يكون هذا أحد:

إذا كنت بحاجة إلى تجميع قوائم المتغيرات (مثل tf.Graph.get_collection(tf.GraphKeys.VARIABLES) ) ، .variables .trainable_variables وسمات .trainable_variables Layer و Model .

تنفذ فئات Layer Model العديد من الخصائص الأخرى التي تزيل الحاجة إلى المجموعات العالمية. يمكن أن تكون خاصية .losses الخاصة بهم بديلاً عن استخدام مجموعة tf.GraphKeys.LOSSES .

الرجوع إلى أدلة Keras لمزيد من التفاصيل.

3. قم بترقية حلقات التدريب الخاصة بك

استخدم أعلى مستوى من واجهة برمجة التطبيقات التي تناسب حالة الاستخدام الخاصة بك. تفضل tf.keras.Model.fit على بناء حلقات التدريب الخاصة بك.

تدير هذه الوظائف عالية المستوى الكثير من التفاصيل منخفضة المستوى التي قد يكون من السهل تفويتها إذا كتبت حلقة التدريب الخاصة بك. على سبيل المثال ، يقومون تلقائيًا بجمع خسائر التنظيم ، وضبط training=True حجة training=True عند استدعاء النموذج.

4. قم بترقية خطوط أنابيب إدخال البيانات الخاصة بك

استخدم مجموعات بيانات tf.data لإدخال البيانات. هذه الكائنات فعالة ومعبرة وتتكامل جيدًا مع Tensorflow.

يمكن تمريرها مباشرة إلى طريقة tf.keras.Model.fit .

model.fit(dataset, epochs=5)

يمكن تكرارها على لغة بايثون القياسية مباشرة:

for example_batch, label_batch in dataset:
    break

5. الترحيل من رموز compat.v1

تحتوي الوحدة النمطية tf.compat.v1 على TensorFlow 1.x API الكامل ، مع دلالاتها الأصلية.

سيقوم البرنامج النصي للترقية TensorFlow 2.x بتحويل الرموز إلى مكافئاتها v2 إذا كان هذا التحويل آمنًا ، على سبيل المثال ، إذا كان بإمكانه تحديد أن سلوك إصدار TensorFlow 2.x مكافئ تمامًا (على سبيل المثال ، سيعيد تسمية v1.arg_max إلى tf.argmax ، tf.argmax نفس الوظيفة).

بعد الانتهاء من البرنامج النصي للترقية باستخدام جزء من التعليمات البرمجية ، من المحتمل أن يكون هناك العديد من الإشارات إلى compat.v1 . يجدر الاطلاع على الكود وتحويلها يدويًا إلى مكافئ v2 (يجب ذكره في السجل إذا كان هناك واحد).

تحويل النماذج

المتغيرات منخفضة المستوى وتنفيذ المشغل

تتضمن أمثلة استخدام واجهة برمجة التطبيقات منخفضة المستوى ما يلي:

  • استخدام نطاقات متغيرة للتحكم في إعادة الاستخدام.
  • إنشاء متغيرات باستخدام v1.get_variable .
  • الوصول إلى المجموعات بشكل صريح.
  • الوصول إلى المجموعات ضمنيًا باستخدام طرق مثل:

  • استخدام v1.placeholder لإعداد مدخلات الرسم البياني.

  • تنفيذ الرسوم البيانية باستخدام Session.run .

  • تهيئة المتغيرات يدويًا.

قبل التحويل

إليك ما قد تبدو عليه هذه الأنماط في التعليمات البرمجية باستخدام TensorFlow 1.x.

import tensorflow as tf
import tensorflow.compat.v1 as v1

import tensorflow_datasets as tfds
g = v1.Graph()

with g.as_default():
  in_a = v1.placeholder(dtype=v1.float32, shape=(2))
  in_b = v1.placeholder(dtype=v1.float32, shape=(2))

  def forward(x):
    with v1.variable_scope("matmul", reuse=v1.AUTO_REUSE):
      W = v1.get_variable("W", initializer=v1.ones(shape=(2,2)),
                          regularizer=lambda x:tf.reduce_mean(x**2))
      b = v1.get_variable("b", initializer=v1.zeros(shape=(2)))
      return W * x + b

  out_a = forward(in_a)
  out_b = forward(in_b)
  reg_loss=v1.losses.get_regularization_loss(scope="matmul")

with v1.Session(graph=g) as sess:
  sess.run(v1.global_variables_initializer())
  outs = sess.run([out_a, out_b, reg_loss],
                feed_dict={in_a: [1, 0], in_b: [0, 1]})

print(outs[0])
print()
print(outs[1])
print()
print(outs[2])
[[1. 0.]
 [1. 0.]]

[[0. 1.]
 [0. 1.]]

1.0

بعد التحويل

في الكود المحول:

  • المتغيرات هي كائنات بايثون المحلية.
  • لا تزال وظيفة forward تحدد الحساب.
  • يتم استبدال المكالمة Session.run بمكالمة لإعادة forward .
  • يمكن إضافة tf.function الاختيارية tf.function من أجل الأداء.
  • يتم حساب التنظيمات يدويًا ، دون الرجوع إلى أي مجموعة عمومية.
  • لا يوجد استخدام للجلسات أو العناصر النائبة .
W = tf.Variable(tf.ones(shape=(2,2)), name="W")
b = tf.Variable(tf.zeros(shape=(2)), name="b")

@tf.function
def forward(x):
  return W * x + b

out_a = forward([1,0])
print(out_a)
tf.Tensor(
[[1. 0.]
 [1. 0.]], shape=(2, 2), dtype=float32)
out_b = forward([0,1])

regularizer = tf.keras.regularizers.l2(0.04)
reg_loss=regularizer(W)

نماذج تستند إلى tf.layers

v1.layers الوحدة النمطية v1.layers لاحتواء وظائف الطبقة التي تعتمد على v1.variable_scope لتعريف المتغيرات وإعادة استخدامها.

قبل التحويل

def model(x, training, scope='model'):
  with v1.variable_scope(scope, reuse=v1.AUTO_REUSE):
    x = v1.layers.conv2d(x, 32, 3, activation=v1.nn.relu,
          kernel_regularizer=lambda x:0.004*tf.reduce_mean(x**2))
    x = v1.layers.max_pooling2d(x, (2, 2), 1)
    x = v1.layers.flatten(x)
    x = v1.layers.dropout(x, 0.1, training=training)
    x = v1.layers.dense(x, 64, activation=v1.nn.relu)
    x = v1.layers.batch_normalization(x, training=training)
    x = v1.layers.dense(x, 10)
    return x
train_data = tf.ones(shape=(1, 28, 28, 1))
test_data = tf.ones(shape=(1, 28, 28, 1))

train_out = model(train_data, training=True)
test_out = model(test_data, training=False)

print(train_out)
print()
print(test_out)
/tmpfs/src/tf_docs_env/lib/python3.6/site-packages/tensorflow/python/keras/legacy_tf_layers/convolutional.py:414: UserWarning: `tf.layers.conv2d` is deprecated and will be removed in a future version. Please Use `tf.keras.layers.Conv2D` instead.
  warnings.warn('`tf.layers.conv2d` is deprecated and '
/tmpfs/src/tf_docs_env/lib/python3.6/site-packages/tensorflow/python/keras/engine/base_layer.py:2273: UserWarning: `layer.apply` is deprecated and will be removed in a future version. Please use `layer.__call__` method instead.
  warnings.warn('`layer.apply` is deprecated and '
tf.Tensor([[0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]], shape=(1, 10), dtype=float32)

tf.Tensor(
[[ 0.379358   -0.55901194  0.48704922  0.11619566  0.23902717  0.01691487
   0.07227738  0.14556988  0.2459927   0.2501198 ]], shape=(1, 10), dtype=float32)
/tmpfs/src/tf_docs_env/lib/python3.6/site-packages/tensorflow/python/keras/legacy_tf_layers/pooling.py:310: UserWarning: `tf.layers.max_pooling2d` is deprecated and will be removed in a future version. Please use `tf.keras.layers.MaxPooling2D` instead.
  warnings.warn('`tf.layers.max_pooling2d` is deprecated and '
/tmpfs/src/tf_docs_env/lib/python3.6/site-packages/tensorflow/python/keras/legacy_tf_layers/core.py:329: UserWarning: `tf.layers.flatten` is deprecated and will be removed in a future version. Please use `tf.keras.layers.Flatten` instead.
  warnings.warn('`tf.layers.flatten` is deprecated and '
/tmpfs/src/tf_docs_env/lib/python3.6/site-packages/tensorflow/python/keras/legacy_tf_layers/core.py:268: UserWarning: `tf.layers.dropout` is deprecated and will be removed in a future version. Please use `tf.keras.layers.Dropout` instead.
  warnings.warn('`tf.layers.dropout` is deprecated and '
/tmpfs/src/tf_docs_env/lib/python3.6/site-packages/tensorflow/python/keras/legacy_tf_layers/core.py:171: UserWarning: `tf.layers.dense` is deprecated and will be removed in a future version. Please use `tf.keras.layers.Dense` instead.
  warnings.warn('`tf.layers.dense` is deprecated and '
/tmpfs/src/tf_docs_env/lib/python3.6/site-packages/tensorflow/python/keras/legacy_tf_layers/normalization.py:308: UserWarning: `tf.layers.batch_normalization` is deprecated and will be removed in a future version. Please use `tf.keras.layers.BatchNormalization` instead. In particular, `tf.control_dependencies(tf.GraphKeys.UPDATE_OPS)` should not be used (consult the `tf.keras.layers.BatchNormalization` documentation).
  '`tf.layers.batch_normalization` is deprecated and '

بعد التحويل

بقيت معظم الحجج كما هي. لكن لاحظ الاختلافات:

  • يتم تمرير وسيطة training إلى كل طبقة بواسطة النموذج عند تشغيله.
  • اختفت الوسيطة الأولى لوظيفة model الأصلي (الإدخال x ). وذلك لأن طبقات الكائن تفصل بناء النموذج عن استدعاء النموذج.

لاحظ أيضًا أن:

  • إذا كنت تستخدم tf.contrib منتظمة أو tf.contrib من tf.contrib ، tf.contrib تغييرات في الوسيطة أكثر من غيرها.
  • لم يعد الرمز يكتب إلى المجموعات ، لذا لن v1.losses.get_regularization_loss وظائف مثل v1.losses.get_regularization_loss تُرجع هذه القيم ، مما قد يؤدي إلى كسر حلقات التدريب الخاصة بك.
model = tf.keras.Sequential([
    tf.keras.layers.Conv2D(32, 3, activation='relu',
                           kernel_regularizer=tf.keras.regularizers.l2(0.04),
                           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)
])

train_data = tf.ones(shape=(1, 28, 28, 1))
test_data = tf.ones(shape=(1, 28, 28, 1))
train_out = model(train_data, training=True)
print(train_out)
tf.Tensor([[0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]], shape=(1, 10), dtype=float32)
test_out = model(test_data, training=False)
print(test_out)
tf.Tensor(
[[-0.2145557  -0.22979769 -0.14968733  0.01208701 -0.07569927  0.3475932
   0.10718458  0.03482988 -0.04309493 -0.10469118]], shape=(1, 10), dtype=float32)
# Here are all the trainable variables
len(model.trainable_variables)
8
# Here is the regularization loss
model.losses
[<tf.Tensor: shape=(), dtype=float32, numpy=0.08174552>]

المتغيرات المختلطة و v1.layers

غالبًا ما تمزج التعليمات البرمجية الحالية بين متغيرات TensorFlow 1.x ذات المستوى المنخفض والعمليات مع v1.layers ذات المستوى v1.layers .

قبل التحويل

def model(x, training, scope='model'):
  with v1.variable_scope(scope, reuse=v1.AUTO_REUSE):
    W = v1.get_variable(
      "W", dtype=v1.float32,
      initializer=v1.ones(shape=x.shape),
      regularizer=lambda x:0.004*tf.reduce_mean(x**2),
      trainable=True)
    if training:
      x = x + W
    else:
      x = x + W * 0.5
    x = v1.layers.conv2d(x, 32, 3, activation=tf.nn.relu)
    x = v1.layers.max_pooling2d(x, (2, 2), 1)
    x = v1.layers.flatten(x)
    return x

train_out = model(train_data, training=True)
test_out = model(test_data, training=False)

بعد التحويل

لتحويل هذا الرمز ، اتبع نمط تعيين الطبقات إلى طبقات كما في المثال السابق.

النمط العام هو:

  • اجمع معلمات الطبقة في __init__ .
  • بناء المتغيرات في build .
  • تنفيذ العمليات الحسابية في call ، وإرجاع النتيجة.

إن v1.variable_scope هو أساسًا طبقة خاصة به. لذا tf.keras.layers.Layer هيئة tf.keras.layers.Layer . تحقق من عمل طبقات ونماذج جديدة عبر دليل التصنيف الفرعي للحصول على التفاصيل.

# Create a custom layer for part of the model
class CustomLayer(tf.keras.layers.Layer):
  def __init__(self, *args, **kwargs):
    super(CustomLayer, self).__init__(*args, **kwargs)

  def build(self, input_shape):
    self.w = self.add_weight(
        shape=input_shape[1:],
        dtype=tf.float32,
        initializer=tf.keras.initializers.ones(),
        regularizer=tf.keras.regularizers.l2(0.02),
        trainable=True)

  # Call method will sometimes get used in graph mode,
  # training will get turned into a tensor
  @tf.function
  def call(self, inputs, training=None):
    if training:
      return inputs + self.w
    else:
      return inputs + self.w * 0.5
custom_layer = CustomLayer()
print(custom_layer([1]).numpy())
print(custom_layer([1], training=True).numpy())
[1.5]
[2.]
train_data = tf.ones(shape=(1, 28, 28, 1))
test_data = tf.ones(shape=(1, 28, 28, 1))

# Build the model including the custom layer
model = tf.keras.Sequential([
    CustomLayer(input_shape=(28, 28, 1)),
    tf.keras.layers.Conv2D(32, 3, activation='relu'),
    tf.keras.layers.MaxPooling2D(),
    tf.keras.layers.Flatten(),
])

train_out = model(train_data, training=True)
test_out = model(test_data, training=False)

بعض الأشياء التي يجب ملاحظتها:

  • تحتاج نماذج وطبقات Keras المصنفة تحت الفئات الفرعية إلى العمل في كل من الرسوم البيانية v1 (لا توجد اعتماديات تحكم تلقائي) وفي الوضع الشغوف:

    • قم بلف call في tf.function للحصول على تبعيات توقيعات وتحكم آلي.
  • لا تنس قبول حجة training call :

    • في بعض الأحيان هو tf.Tensor
    • في بعض الأحيان تكون لغة بايثون منطقية
  • قم بإنشاء متغيرات النموذج في المُنشئ أو Model.build باستخدام `self.add_weight:

    • في Model.build يمكنك الوصول إلى شكل الإدخال ، لذلك يمكنك إنشاء أوزان ذات شكل مطابق
    • يسمح استخدام tf.keras.layers.Layer.add_weight Keras بتتبع المتغيرات وخسائر التنظيم
  • لا تحتفظ tf.Tensors في الأشياء الخاصة بك:

    • قد يتم إنشاؤها إما في tf.function أو في سياق متحمس ، وتتصرف هذه الموترات بشكل مختلف
    • استخدم tf.Variable s للحالة ، فهي قابلة للاستخدام دائمًا من كلا السياقين
    • tf.Tensors هي فقط للقيم الوسيطة

ملاحظة على Slim و Contrib.layers

يستخدم قدر كبير من كود TensorFlow 1.x الأقدم مكتبة Slim ، التي تم تعبئتها مع TensorFlow 1.x كـ tf.contrib.layers . contrib نمطية مساهمة ، لم يعد هذا متاحًا في TensorFlow 2.x ، حتى في tf.compat.v1 . يعد تحويل التعليمات البرمجية باستخدام Slim إلى TensorFlow 2.x أكثر تعقيدًا من تحويل المستودعات التي تستخدم v1.layers . في الواقع ، قد يكون من المنطقي تحويل كود Slim الخاص بك إلى v1.layers أولاً ، ثم التحويل إلى Keras.

  • إزالة arg_scopes ، يجب أن تكون جميع arg_scopes صريحة.
  • إذا كنت تستخدمها ، فقم بتقسيم normalizer_fn و activation_fn إلى activation_fn الخاصة.
  • ترسم طبقات التحويل المنفصلة إلى طبقة Keras مختلفة أو أكثر (طبقات Keras في العمق والنقطة وقابلة للفصل).
  • Slim و v1.layers لها أسماء وسيطات مختلفة وقيم افتراضية.
  • بعض args لها مقاييس مختلفة.
  • إذا كنت تستخدم نماذج Slim المدربة مسبقًا ، فجرب نماذج Keras مسبقة التدريب من tf.keras.applications أو TensorFlow 2.x SavedModels من TF Hub المُصدرة من كود Slim الأصلي.

ربما لم يتم نقل بعض طبقات tf.contrib إلى TensorFlow الأساسية ولكن تم نقلها بدلاً من ذلك إلى حزمة TensorFlow Addons .

تمرين

هناك العديد من الطرق لتغذية البيانات إلى نموذج tf.keras . سيقبلون مولدات Python ومصفوفات Numpy كمدخلات.

الطريقة الموصى بها لتغذية البيانات إلى نموذج هي استخدام حزمة tf.data ، والتي تحتوي على مجموعة من فئات الأداء العالي لمعالجة البيانات.

إذا كنت لا تزال تستخدم tf.queue ، فهي الآن مدعومة فقط tf.queue بيانات ، وليس tf.queue أنابيب إدخال.

استخدام مجموعات بيانات TensorFlow

تحتوي حزمة TensorFlow Datasets ( tfds ) على أدوات مساعدة لتحميل مجموعات البيانات المحددة مسبقًا ككائناتtf.data.Dataset .

في هذا المثال ، يمكنك تحميل مجموعة بيانات tfds باستخدام tfds :

datasets, info = tfds.load(name='mnist', with_info=True, as_supervised=True)
mnist_train, mnist_test = datasets['train'], datasets['test']
Downloading and preparing dataset mnist/3.0.1 (download: 11.06 MiB, generated: 21.00 MiB, total: 32.06 MiB) to /home/kbuilder/tensorflow_datasets/mnist/3.0.1...
WARNING:absl:Dataset mnist is hosted on GCS. It will automatically be downloaded to your
local data directory. If you'd instead prefer to read directly from our public
GCS bucket (recommended if you're running on GCP), you can instead pass
`try_gcs=True` to `tfds.load` or set `data_dir=gs://tfds-data/datasets`.
Dataset mnist downloaded and prepared to /home/kbuilder/tensorflow_datasets/mnist/3.0.1. Subsequent calls will reuse this data.

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

  • أعد قياس كل صورة.
  • تبديل ترتيب الأمثلة عشوائيًا.
  • اجمع دفعات من الصور والتسميات.
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))

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

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

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

  • يقبلون مصفوفات tf.data.Datasets ومولدات Python و 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 [==============================] - 1s 9ms/step - loss: 2.0191 - accuracy: 0.3608
Epoch 2/5
5/5 [==============================] - 0s 9ms/step - loss: 0.4736 - accuracy: 0.9059
Epoch 3/5
5/5 [==============================] - 0s 8ms/step - loss: 0.2973 - accuracy: 0.9626
Epoch 4/5
5/5 [==============================] - 0s 9ms/step - loss: 0.2108 - accuracy: 0.9911
Epoch 5/5
5/5 [==============================] - 0s 8ms/step - loss: 0.1791 - accuracy: 0.9874
5/5 [==============================] - 0s 6ms/step - loss: 1.5504 - accuracy: 0.7500
Loss 1.5504140853881836, Accuracy 0.75

اكتب الحلقة الخاصة بك

إذا كانت خطوة تدريب نموذج Keras مناسبة لك ، لكنك بحاجة إلى مزيد من التحكم خارج هذه الخطوة ، ففكر في استخدام طريقة tf.keras.Model.train_on_batch ، في حلقة تكرار البيانات الخاصة بك.

تذكر: يمكن تنفيذ العديد من الأشياء على أنها tf.keras.callbacks.Callback .

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

يمكنك أيضًا استخدام tf.keras.Model.test_on_batch أو tf.keras.Model.evaluate للتحقق من الأداء أثناء التدريب.

لمواصلة تدريب النموذج أعلاه:

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

for epoch in range(NUM_EPOCHS):
  # Reset the metric accumulators
  model.reset_metrics()

  for image_batch, label_batch in train_data:
    result = model.train_on_batch(image_batch, label_batch)
    metrics_names = model.metrics_names
    print("train: ",
          "{}: {:.3f}".format(metrics_names[0], result[0]),
          "{}: {:.3f}".format(metrics_names[1], result[1]))
  for image_batch, label_batch in test_data:
    result = model.test_on_batch(image_batch, label_batch,
                                 # Return accumulated metrics
                                 reset_metrics=False)
  metrics_names = model.metrics_names
  print("\neval: ",
        "{}: {:.3f}".format(metrics_names[0], result[0]),
        "{}: {:.3f}".format(metrics_names[1], result[1]))
train:  loss: 0.138 accuracy: 1.000
train:  loss: 0.161 accuracy: 1.000
train:  loss: 0.159 accuracy: 0.969
train:  loss: 0.241 accuracy: 0.953
train:  loss: 0.172 accuracy: 0.969

eval:  loss: 1.550 accuracy: 0.800
train:  loss: 0.086 accuracy: 1.000
train:  loss: 0.094 accuracy: 1.000
train:  loss: 0.090 accuracy: 1.000
train:  loss: 0.119 accuracy: 0.984
train:  loss: 0.099 accuracy: 1.000

eval:  loss: 1.558 accuracy: 0.841
train:  loss: 0.076 accuracy: 1.000
train:  loss: 0.068 accuracy: 1.000
train:  loss: 0.061 accuracy: 1.000
train:  loss: 0.076 accuracy: 1.000
train:  loss: 0.076 accuracy: 1.000

eval:  loss: 1.536 accuracy: 0.841
train:  loss: 0.059 accuracy: 1.000
train:  loss: 0.056 accuracy: 1.000
train:  loss: 0.058 accuracy: 1.000
train:  loss: 0.054 accuracy: 1.000
train:  loss: 0.055 accuracy: 1.000

eval:  loss: 1.497 accuracy: 0.863
train:  loss: 0.053 accuracy: 1.000
train:  loss: 0.049 accuracy: 1.000
train:  loss: 0.044 accuracy: 1.000
train:  loss: 0.049 accuracy: 1.000
train:  loss: 0.045 accuracy: 1.000

eval:  loss: 1.463 accuracy: 0.878

تخصيص خطوة التدريب

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

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

تذكر:

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

لاحظ التبسيط المتعلق بـ v1:

  • ليست هناك حاجة لتشغيل التهيئة المتغيرة. تتم تهيئة المتغيرات عند الإنشاء.
  • ليست هناك حاجة لإضافة تبعيات التحكم اليدوي. حتى في عمليات tf.function تعمل كما في الوضع 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)
Finished epoch 0
Finished epoch 1
Finished epoch 2
Finished epoch 3
Finished epoch 4

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

في TensorFlow 2.x ، تعتبر المقاييس والخسائر كائنات. هذه تعمل بشغف وفي tf.function .

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

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

الكائن المتري له الطرق التالية:

  • Metric.update_state() : أضف ملاحظات جديدة.
  • Metric.result() : الحصول على النتيجة الحالية للمقياس ، بالنظر إلى القيم المرصودة.
  • Metric.reset_states() : امسح كل الملاحظات.

الكائن نفسه قابل للاستدعاء. يؤدي الاتصال إلى تحديث الحالة بملاحظات جديدة ، كما هو الحال مع update_state ، وإرجاع النتيجة الجديدة للمقياس.

لست مضطرًا إلى تهيئة متغيرات مقياس ما يدويًا ، ولأن TensorFlow 2.x له تبعيات تحكم تلقائية ، فلا داعي للقلق بشأن هذه المتغيرات أيضًا.

يستخدم الكود أدناه مقياسًا لتتبع متوسط ​​الخسارة الملحوظ داخل حلقة تدريب مخصصة.

# 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))
Epoch:  0
  loss:     0.139
  accuracy: 0.997
Epoch:  1
  loss:     0.116
  accuracy: 1.000
Epoch:  2
  loss:     0.105
  accuracy: 0.997
Epoch:  3
  loss:     0.089
  accuracy: 1.000
Epoch:  4
  loss:     0.078
  accuracy: 1.000

أسماء مترية Keras

في TensorFlow 2.x ، تكون نماذج 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 8ms/step - loss: 0.0901 - acc: 0.9923 - accuracy: 0.9923 - my_accuracy: 0.9923
history.history.keys()
dict_keys(['loss', 'acc', 'accuracy', 'my_accuracy'])

هذا يختلف عن الإصدارات السابقة حيث يؤدي تمرير metrics=["accuracy"] إلى dict_keys(['loss', 'acc'])

محسنون Keras

v1.train في v1.train ، مثل v1.train.AdamOptimizer و v1.train.GradientDescentOptimizer ، لديهم مكافئات في tf.keras.optimizers .

تحويل v1.train إلى keras.optimizers

فيما يلي بعض الأشياء التي يجب وضعها في الاعتبار عند تحويل أدوات تحسين الأداء:

افتراضات جديدة لبعض tf.keras.optimizers

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

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

TensorBoard

يتضمن TensorFlow 2.x تغييرات مهمة على tf.summary API المستخدمة لكتابة بيانات موجزة للتصور في TensorBoard. للحصول على مقدمة عامة عن tf.summary الجديد ، هناك العديد من البرامج التعليمية المتاحة التي تستخدم TensorFlow 2.x API. يتضمن هذا دليل ترحيل TensorBoard TensorFlow 2.x.

الحفظ والتحميل

التوافق مع نقاط التفتيش

يستخدم TensorFlow 2.x نقاط التحقق القائمة على الكائنات .

لا يزال من الممكن تحميل نقاط التفتيش القديمة القائمة على الاسم ، إذا كنت حريصًا. قد تؤدي عملية تحويل التعليمات البرمجية إلى تغييرات اسم متغير ، ولكن هناك حلولاً بديلة.

أبسط طريقة لمحاذاة أسماء النموذج الجديد مع الأسماء الموجودة في نقطة التفتيش:

  • لا تزال جميع المتغيرات تحتوي على وسيطة name يمكنك تعيينها.
  • تأخذ نماذج Keras أيضًا وسيطة name حيث يتم تعيينها كبادئة لمتغيراتها.
  • يمكن استخدام وظيفة v1.name_scope لتعيين بادئات اسم المتغير. هذا يختلف كثيرًا عن tf.variable_scope . إنه يؤثر فقط على الأسماء ، ولا يتتبع المتغيرات ويعيد استخدامها.

إذا لم ينجح ذلك في حالة الاستخدام الخاصة بك ، فجرّب وظيفة v1.train.init_from_checkpoint . يتطلب الأمر الوسيطة assignment_map ، والتي تحدد التعيين من الأسماء القديمة إلى الأسماء الجديدة.

يشتمل مستودع TensorFlow Estimator على أداة تحويل لترقية نقاط التفتيش للمقدرات المعدة مسبقًا من TensorFlow 1.x إلى 2.0. قد يكون بمثابة مثال على كيفية بناء أداة لحالة استخدام مماثلة.

توافق النماذج المحفوظة

لا توجد مخاوف كبيرة بشأن التوافق للنماذج المحفوظة.

  • تعمل TensorFlow 1.x save_models في TensorFlow 2.x.
  • تعمل TensorFlow 2.x save_models في TensorFlow 1.x إذا كانت جميع العمليات مدعومة.

A Graph.pb أو Graph.pbtxt

لا توجد طريقة مباشرة لترقية ملف Graph.pb خام إلى TensorFlow 2.x. أفضل رهان لك هو ترقية الكود الذي أنشأ الملف.

ولكن، إذا كان لديك "الرسم البياني المجمدة" (أ tf.Graph حيث تحولت المتغيرات إلى الثوابت)، فمن الممكن تحويل هذا إلى concrete_function باستخدام v1.wrap_function :

def wrap_frozen_graph(graph_def, inputs, outputs):
  def _imports_graph_def():
    tf.compat.v1.import_graph_def(graph_def, name="")
  wrapped_import = tf.compat.v1.wrap_function(_imports_graph_def, [])
  import_graph = wrapped_import.graph
  return wrapped_import.prune(
      tf.nest.map_structure(import_graph.as_graph_element, inputs),
      tf.nest.map_structure(import_graph.as_graph_element, outputs))

على سبيل المثال ، يوجد هنا رسم بياني مجمد لـ Inception v1 ، من 2016:

path = tf.keras.utils.get_file(
    'inception_v1_2016_08_28_frozen.pb',
    'http://storage.googleapis.com/download.tensorflow.org/models/inception_v1_2016_08_28_frozen.pb.tar.gz',
    untar=True)
Downloading data from http://storage.googleapis.com/download.tensorflow.org/models/inception_v1_2016_08_28_frozen.pb.tar.gz
24698880/24695710 [==============================] - 1s 0us/step

قم بتحميل tf.GraphDef :

graph_def = tf.compat.v1.GraphDef()
loaded = graph_def.ParseFromString(open(path,'rb').read())

لفها في وظيفة concrete_function :

inception_func = wrap_frozen_graph(
    graph_def, inputs='input:0',
    outputs='InceptionV1/InceptionV1/Mixed_3b/Branch_1/Conv2d_0a_1x1/Relu:0')

مرره موتر كمدخل:

input_img = tf.ones([1,224,224,3], dtype=tf.float32)
inception_func(input_img).shape
TensorShape([1, 28, 28, 96])

مقدّرون

التدريب مع المقدرين

المقدّرون مدعومون في TensorFlow 2.x.

عند استخدام المقدرات ، يمكنك استخدام input_fn و tf.estimator.TrainSpec و tf.estimator.EvalSpec من TensorFlow 1.x.

فيما يلي مثال باستخدام input_fn مع مواصفات القطار وتقييمها.

إنشاء مواصفات input_fn و train / EVAL

# Define the estimator's input_fn
def input_fn():
  datasets, info = tfds.load(name='mnist', with_info=True, as_supervised=True)
  mnist_train, mnist_test = datasets['train'], datasets['test']

  BUFFER_SIZE = 10000
  BATCH_SIZE = 64

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

    return image, label[..., tf.newaxis]

  train_data = mnist_train.map(scale).shuffle(BUFFER_SIZE).batch(BATCH_SIZE)
  return train_data.repeat()

# Define train and eval specs
train_spec = tf.estimator.TrainSpec(input_fn=input_fn,
                                    max_steps=STEPS_PER_EPOCH * NUM_EPOCHS)
eval_spec = tf.estimator.EvalSpec(input_fn=input_fn,
                                  steps=STEPS_PER_EPOCH)

استخدام تعريف نموذج Keras

توجد بعض الاختلافات في كيفية بناء المقدرات الخاصة بك في TensorFlow 2.x.

يوصى بتعريف نموذجك باستخدام Keras ، ثم استخدام الأداة المساعدة tf.keras.estimator.model_to_estimator لتحويل نموذجك إلى مقدر. يوضح الكود أدناه كيفية استخدام هذه الأداة عند إنشاء مقدر وتدريبه.

def make_model():
  return 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 = make_model()

model.compile(optimizer='adam',
              loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
              metrics=['accuracy'])

estimator = tf.keras.estimator.model_to_estimator(
  keras_model = model
)

tf.estimator.train_and_evaluate(estimator, train_spec, eval_spec)
INFO:tensorflow:Using default config.
INFO:tensorflow:Using default config.
WARNING:tensorflow:Using temporary folder as model directory: /tmp/tmp0erq3im2
WARNING:tensorflow:Using temporary folder as model directory: /tmp/tmp0erq3im2
INFO:tensorflow:Using the Keras model provided.
INFO:tensorflow:Using the Keras model provided.
/tmpfs/src/tf_docs_env/lib/python3.6/site-packages/tensorflow/python/keras/backend.py:434: UserWarning: `tf.keras.backend.set_learning_phase` is deprecated and will be removed after 2020-10-11. To update it, simply pass a True/False value to the `training` argument of the `__call__` method of your layer or model.
  warnings.warn('`tf.keras.backend.set_learning_phase` is deprecated and '
INFO:tensorflow:Using config: {'_model_dir': '/tmp/tmp0erq3im2', '_tf_random_seed': None, '_save_summary_steps': 100, '_save_checkpoints_steps': None, '_save_checkpoints_secs': 600, '_session_config': allow_soft_placement: true
graph_options {
  rewrite_options {
    meta_optimizer_iterations: ONE
  }
}
, '_keep_checkpoint_max': 5, '_keep_checkpoint_every_n_hours': 10000, '_log_step_count_steps': 100, '_train_distribute': None, '_device_fn': None, '_protocol': None, '_eval_distribute': None, '_experimental_distribute': None, '_experimental_max_worker_delay_secs': None, '_session_creation_timeout_secs': 7200, '_checkpoint_save_graph_def': True, '_service': None, '_cluster_spec': ClusterSpec({}), '_task_type': 'worker', '_task_id': 0, '_global_id_in_cluster': 0, '_master': '', '_evaluation_master': '', '_is_chief': True, '_num_ps_replicas': 0, '_num_worker_replicas': 1}
INFO:tensorflow:Using config: {'_model_dir': '/tmp/tmp0erq3im2', '_tf_random_seed': None, '_save_summary_steps': 100, '_save_checkpoints_steps': None, '_save_checkpoints_secs': 600, '_session_config': allow_soft_placement: true
graph_options {
  rewrite_options {
    meta_optimizer_iterations: ONE
  }
}
, '_keep_checkpoint_max': 5, '_keep_checkpoint_every_n_hours': 10000, '_log_step_count_steps': 100, '_train_distribute': None, '_device_fn': None, '_protocol': None, '_eval_distribute': None, '_experimental_distribute': None, '_experimental_max_worker_delay_secs': None, '_session_creation_timeout_secs': 7200, '_checkpoint_save_graph_def': True, '_service': None, '_cluster_spec': ClusterSpec({}), '_task_type': 'worker', '_task_id': 0, '_global_id_in_cluster': 0, '_master': '', '_evaluation_master': '', '_is_chief': True, '_num_ps_replicas': 0, '_num_worker_replicas': 1}
INFO:tensorflow:Not using Distribute Coordinator.
INFO:tensorflow:Not using Distribute Coordinator.
INFO:tensorflow:Running training and evaluation locally (non-distributed).
INFO:tensorflow:Running training and evaluation locally (non-distributed).
INFO:tensorflow:Start train and evaluate loop. The evaluate will happen after every checkpoint. Checkpoint frequency is determined based on RunConfig arguments: save_checkpoints_steps None or save_checkpoints_secs 600.
INFO:tensorflow:Start train and evaluate loop. The evaluate will happen after every checkpoint. Checkpoint frequency is determined based on RunConfig arguments: save_checkpoints_steps None or save_checkpoints_secs 600.
WARNING:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.6/site-packages/tensorflow/python/training/training_util.py:236: Variable.initialized_value (from tensorflow.python.ops.variables) is deprecated and will be removed in a future version.
Instructions for updating:
Use Variable.read_value. Variables in 2.X are initialized automatically both in eager and graph (inside tf.defun) contexts.
WARNING:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.6/site-packages/tensorflow/python/training/training_util.py:236: Variable.initialized_value (from tensorflow.python.ops.variables) is deprecated and will be removed in a future version.
Instructions for updating:
Use Variable.read_value. Variables in 2.X are initialized automatically both in eager and graph (inside tf.defun) contexts.
INFO:tensorflow:Calling model_fn.
INFO:tensorflow:Calling model_fn.
INFO:tensorflow:Done calling model_fn.
INFO:tensorflow:Done calling model_fn.
INFO:tensorflow:Warm-starting with WarmStartSettings: WarmStartSettings(ckpt_to_initialize_from='/tmp/tmp0erq3im2/keras/keras_model.ckpt', vars_to_warm_start='.*', var_name_to_vocab_info={}, var_name_to_prev_var_name={})
INFO:tensorflow:Warm-starting with WarmStartSettings: WarmStartSettings(ckpt_to_initialize_from='/tmp/tmp0erq3im2/keras/keras_model.ckpt', vars_to_warm_start='.*', var_name_to_vocab_info={}, var_name_to_prev_var_name={})
INFO:tensorflow:Warm-starting from: /tmp/tmp0erq3im2/keras/keras_model.ckpt
INFO:tensorflow:Warm-starting from: /tmp/tmp0erq3im2/keras/keras_model.ckpt
INFO:tensorflow:Warm-starting variables only in TRAINABLE_VARIABLES.
INFO:tensorflow:Warm-starting variables only in TRAINABLE_VARIABLES.
INFO:tensorflow:Warm-started 8 variables.
INFO:tensorflow:Warm-started 8 variables.
INFO:tensorflow:Create CheckpointSaverHook.
INFO:tensorflow:Create CheckpointSaverHook.
INFO:tensorflow:Graph was finalized.
INFO:tensorflow:Graph was finalized.
INFO:tensorflow:Running local_init_op.
INFO:tensorflow:Running local_init_op.
INFO:tensorflow:Done running local_init_op.
INFO:tensorflow:Done running local_init_op.
INFO:tensorflow:Calling checkpoint listeners before saving checkpoint 0...
INFO:tensorflow:Calling checkpoint listeners before saving checkpoint 0...
INFO:tensorflow:Saving checkpoints for 0 into /tmp/tmp0erq3im2/model.ckpt.
INFO:tensorflow:Saving checkpoints for 0 into /tmp/tmp0erq3im2/model.ckpt.
INFO:tensorflow:Calling checkpoint listeners after saving checkpoint 0...
INFO:tensorflow:Calling checkpoint listeners after saving checkpoint 0...
INFO:tensorflow:loss = 2.4717796, step = 0
INFO:tensorflow:loss = 2.4717796, step = 0
INFO:tensorflow:Calling checkpoint listeners before saving checkpoint 25...
INFO:tensorflow:Calling checkpoint listeners before saving checkpoint 25...
INFO:tensorflow:Saving checkpoints for 25 into /tmp/tmp0erq3im2/model.ckpt.
INFO:tensorflow:Saving checkpoints for 25 into /tmp/tmp0erq3im2/model.ckpt.
INFO:tensorflow:Calling checkpoint listeners after saving checkpoint 25...
INFO:tensorflow:Calling checkpoint listeners after saving checkpoint 25...
INFO:tensorflow:Calling model_fn.
INFO:tensorflow:Calling model_fn.
INFO:tensorflow:Done calling model_fn.
/tmpfs/src/tf_docs_env/lib/python3.6/site-packages/tensorflow/python/keras/engine/training.py:2325: UserWarning: `Model.state_updates` will be removed in a future version. This property should not be used in TensorFlow 2.0, as `updates` are applied automatically.
  warnings.warn('`Model.state_updates` will be removed in a future version. '
INFO:tensorflow:Done calling model_fn.
INFO:tensorflow:Starting evaluation at 2021-01-06T02:31:17Z
INFO:tensorflow:Starting evaluation at 2021-01-06T02:31:17Z
INFO:tensorflow:Graph was finalized.
INFO:tensorflow:Graph was finalized.
INFO:tensorflow:Restoring parameters from /tmp/tmp0erq3im2/model.ckpt-25
INFO:tensorflow:Restoring parameters from /tmp/tmp0erq3im2/model.ckpt-25
INFO:tensorflow:Running local_init_op.
INFO:tensorflow:Running local_init_op.
INFO:tensorflow:Done running local_init_op.
INFO:tensorflow:Done running local_init_op.
INFO:tensorflow:Evaluation [1/5]
INFO:tensorflow:Evaluation [1/5]
INFO:tensorflow:Evaluation [2/5]
INFO:tensorflow:Evaluation [2/5]
INFO:tensorflow:Evaluation [3/5]
INFO:tensorflow:Evaluation [3/5]
INFO:tensorflow:Evaluation [4/5]
INFO:tensorflow:Evaluation [4/5]
INFO:tensorflow:Evaluation [5/5]
INFO:tensorflow:Evaluation [5/5]
INFO:tensorflow:Inference Time : 0.86556s
INFO:tensorflow:Inference Time : 0.86556s
INFO:tensorflow:Finished evaluation at 2021-01-06-02:31:18
INFO:tensorflow:Finished evaluation at 2021-01-06-02:31:18
INFO:tensorflow:Saving dict for global step 25: accuracy = 0.6, global_step = 25, loss = 1.6160676
INFO:tensorflow:Saving dict for global step 25: accuracy = 0.6, global_step = 25, loss = 1.6160676
INFO:tensorflow:Saving 'checkpoint_path' summary for global step 25: /tmp/tmp0erq3im2/model.ckpt-25
INFO:tensorflow:Saving 'checkpoint_path' summary for global step 25: /tmp/tmp0erq3im2/model.ckpt-25
INFO:tensorflow:Loss for final step: 0.37597787.
INFO:tensorflow:Loss for final step: 0.37597787.
({'accuracy': 0.6, 'loss': 1.6160676, 'global_step': 25}, [])

استخدام model_fn مخصص

إذا كان لديك مقدر مخصص حالي model_fn تحتاج إلى صيانته ، يمكنك تحويل model_fn الخاص بك لاستخدام نموذج Keras.

ومع ذلك ، لأسباب تتعلق بالتوافق ، سيستمر تشغيل model_fn مخصص في وضع الرسم البياني بنمط 1.x. هذا يعني أنه لا يوجد تنفيذ حريص ولا تبعيات تحكم تلقائية.

model_fn مخصص بأدنى حد من التغييرات

لجعل model_fn المخصص الخاص بك يعمل في TensorFlow 2.x ، إذا كنت تفضل الحد الأدنى من التغييرات على الكود الحالي ، tf.compat.v1 رموز tf.compat.v1 مثل أدوات optimizers tf.compat.v1 metrics .

استخدام نموذج Keras في model_fn المخصص مشابه لاستخدامه في حلقة تدريب مخصصة:

  • اضبط مرحلة training مناسب ، بناءً على وسيطة mode .
  • مرِّر صراحةً trainable_variables يمكن trainable_variables على النموذج إلى المُحسِّن.

ولكن هناك اختلافات مهمة ، بالنسبة للحلقة المخصصة :

  • بدلاً من استخدام Model.losses ، Model.losses الخسائر باستخدام Model.get_losses_for .
  • استخرج تحديثات النموذج باستخدام Model.get_updates_for .

الكود التالي ينشئ model_fn مخصص ، يوضح كل هذه المخاوف.

def my_model_fn(features, labels, mode):
  model = make_model()

  optimizer = tf.compat.v1.train.AdamOptimizer()
  loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True)

  training = (mode == tf.estimator.ModeKeys.TRAIN)
  predictions = model(features, training=training)

  if mode == tf.estimator.ModeKeys.PREDICT:
    return tf.estimator.EstimatorSpec(mode=mode, predictions=predictions)

  reg_losses = model.get_losses_for(None) + model.get_losses_for(features)
  total_loss=loss_fn(labels, predictions) + tf.math.add_n(reg_losses)

  accuracy = tf.compat.v1.metrics.accuracy(labels=labels,
                                           predictions=tf.math.argmax(predictions, axis=1),
                                           name='acc_op')

  update_ops = model.get_updates_for(None) + model.get_updates_for(features)
  minimize_op = optimizer.minimize(
      total_loss,
      var_list=model.trainable_variables,
      global_step=tf.compat.v1.train.get_or_create_global_step())
  train_op = tf.group(minimize_op, update_ops)

  return tf.estimator.EstimatorSpec(
    mode=mode,
    predictions=predictions,
    loss=total_loss,
    train_op=train_op, eval_metric_ops={'accuracy': accuracy})

# Create the Estimator & Train
estimator = tf.estimator.Estimator(model_fn=my_model_fn)
tf.estimator.train_and_evaluate(estimator, train_spec, eval_spec)
INFO:tensorflow:Using default config.
INFO:tensorflow:Using default config.
WARNING:tensorflow:Using temporary folder as model directory: /tmp/tmpifj8mysl
WARNING:tensorflow:Using temporary folder as model directory: /tmp/tmpifj8mysl
INFO:tensorflow:Using config: {'_model_dir': '/tmp/tmpifj8mysl', '_tf_random_seed': None, '_save_summary_steps': 100, '_save_checkpoints_steps': None, '_save_checkpoints_secs': 600, '_session_config': allow_soft_placement: true
graph_options {
  rewrite_options {
    meta_optimizer_iterations: ONE
  }
}
, '_keep_checkpoint_max': 5, '_keep_checkpoint_every_n_hours': 10000, '_log_step_count_steps': 100, '_train_distribute': None, '_device_fn': None, '_protocol': None, '_eval_distribute': None, '_experimental_distribute': None, '_experimental_max_worker_delay_secs': None, '_session_creation_timeout_secs': 7200, '_checkpoint_save_graph_def': True, '_service': None, '_cluster_spec': ClusterSpec({}), '_task_type': 'worker', '_task_id': 0, '_global_id_in_cluster': 0, '_master': '', '_evaluation_master': '', '_is_chief': True, '_num_ps_replicas': 0, '_num_worker_replicas': 1}
INFO:tensorflow:Using config: {'_model_dir': '/tmp/tmpifj8mysl', '_tf_random_seed': None, '_save_summary_steps': 100, '_save_checkpoints_steps': None, '_save_checkpoints_secs': 600, '_session_config': allow_soft_placement: true
graph_options {
  rewrite_options {
    meta_optimizer_iterations: ONE
  }
}
, '_keep_checkpoint_max': 5, '_keep_checkpoint_every_n_hours': 10000, '_log_step_count_steps': 100, '_train_distribute': None, '_device_fn': None, '_protocol': None, '_eval_distribute': None, '_experimental_distribute': None, '_experimental_max_worker_delay_secs': None, '_session_creation_timeout_secs': 7200, '_checkpoint_save_graph_def': True, '_service': None, '_cluster_spec': ClusterSpec({}), '_task_type': 'worker', '_task_id': 0, '_global_id_in_cluster': 0, '_master': '', '_evaluation_master': '', '_is_chief': True, '_num_ps_replicas': 0, '_num_worker_replicas': 1}
INFO:tensorflow:Not using Distribute Coordinator.
INFO:tensorflow:Not using Distribute Coordinator.
INFO:tensorflow:Running training and evaluation locally (non-distributed).
INFO:tensorflow:Running training and evaluation locally (non-distributed).
INFO:tensorflow:Start train and evaluate loop. The evaluate will happen after every checkpoint. Checkpoint frequency is determined based on RunConfig arguments: save_checkpoints_steps None or save_checkpoints_secs 600.
INFO:tensorflow:Start train and evaluate loop. The evaluate will happen after every checkpoint. Checkpoint frequency is determined based on RunConfig arguments: save_checkpoints_steps None or save_checkpoints_secs 600.
INFO:tensorflow:Calling model_fn.
INFO:tensorflow:Calling model_fn.
INFO:tensorflow:Done calling model_fn.
INFO:tensorflow:Done calling model_fn.
INFO:tensorflow:Create CheckpointSaverHook.
INFO:tensorflow:Create CheckpointSaverHook.
INFO:tensorflow:Graph was finalized.
INFO:tensorflow:Graph was finalized.
INFO:tensorflow:Running local_init_op.
INFO:tensorflow:Running local_init_op.
INFO:tensorflow:Done running local_init_op.
INFO:tensorflow:Done running local_init_op.
INFO:tensorflow:Calling checkpoint listeners before saving checkpoint 0...
INFO:tensorflow:Calling checkpoint listeners before saving checkpoint 0...
INFO:tensorflow:Saving checkpoints for 0 into /tmp/tmpifj8mysl/model.ckpt.
INFO:tensorflow:Saving checkpoints for 0 into /tmp/tmpifj8mysl/model.ckpt.
INFO:tensorflow:Calling checkpoint listeners after saving checkpoint 0...
INFO:tensorflow:Calling checkpoint listeners after saving checkpoint 0...
INFO:tensorflow:loss = 3.0136237, step = 0
INFO:tensorflow:loss = 3.0136237, step = 0
INFO:tensorflow:Calling checkpoint listeners before saving checkpoint 25...
INFO:tensorflow:Calling checkpoint listeners before saving checkpoint 25...
INFO:tensorflow:Saving checkpoints for 25 into /tmp/tmpifj8mysl/model.ckpt.
INFO:tensorflow:Saving checkpoints for 25 into /tmp/tmpifj8mysl/model.ckpt.
INFO:tensorflow:Calling checkpoint listeners after saving checkpoint 25...
INFO:tensorflow:Calling checkpoint listeners after saving checkpoint 25...
INFO:tensorflow:Calling model_fn.
INFO:tensorflow:Calling model_fn.
INFO:tensorflow:Done calling model_fn.
INFO:tensorflow:Done calling model_fn.
INFO:tensorflow:Starting evaluation at 2021-01-06T02:31:20Z
INFO:tensorflow:Starting evaluation at 2021-01-06T02:31:20Z
INFO:tensorflow:Graph was finalized.
INFO:tensorflow:Graph was finalized.
INFO:tensorflow:Restoring parameters from /tmp/tmpifj8mysl/model.ckpt-25
INFO:tensorflow:Restoring parameters from /tmp/tmpifj8mysl/model.ckpt-25
INFO:tensorflow:Running local_init_op.
INFO:tensorflow:Running local_init_op.
INFO:tensorflow:Done running local_init_op.
INFO:tensorflow:Done running local_init_op.
INFO:tensorflow:Evaluation [1/5]
INFO:tensorflow:Evaluation [1/5]
INFO:tensorflow:Evaluation [2/5]
INFO:tensorflow:Evaluation [2/5]
INFO:tensorflow:Evaluation [3/5]
INFO:tensorflow:Evaluation [3/5]
INFO:tensorflow:Evaluation [4/5]
INFO:tensorflow:Evaluation [4/5]
INFO:tensorflow:Evaluation [5/5]
INFO:tensorflow:Evaluation [5/5]
INFO:tensorflow:Inference Time : 0.97406s
INFO:tensorflow:Inference Time : 0.97406s
INFO:tensorflow:Finished evaluation at 2021-01-06-02:31:21
INFO:tensorflow:Finished evaluation at 2021-01-06-02:31:21
INFO:tensorflow:Saving dict for global step 25: accuracy = 0.59375, global_step = 25, loss = 1.6248872
INFO:tensorflow:Saving dict for global step 25: accuracy = 0.59375, global_step = 25, loss = 1.6248872
INFO:tensorflow:Saving 'checkpoint_path' summary for global step 25: /tmp/tmpifj8mysl/model.ckpt-25
INFO:tensorflow:Saving 'checkpoint_path' summary for global step 25: /tmp/tmpifj8mysl/model.ckpt-25
INFO:tensorflow:Loss for final step: 0.35726172.
INFO:tensorflow:Loss for final step: 0.35726172.
({'accuracy': 0.59375, 'loss': 1.6248872, 'global_step': 25}, [])

model_fn مخصص model_fn TensorFlow 2.x

إذا كنت تريد التخلص من جميع رموز TensorFlow 1.x وترقية model_fn المخصص إلى TensorFlow 2.x ، فأنت بحاجة إلى تحديث المحسن والمقاييس إلى tf.keras.optimizers و tf.keras.metrics .

في model_fn المخصص ، بالإضافة إلى التغييرات المذكورة أعلاه ، يجب إجراء المزيد من الترقيات:

  • استخدم tf.keras.optimizers بدلاً من v1.train.Optimizer .
  • قم بتمرير tf.keras.optimizers trainable_variables الخاصة بالنموذج بشكل صريح إلى الملف tf.keras.optimizers .
  • لحساب train_op/minimize_op ،
    • استخدم Optimizer.get_updates إذا كانت الخسارة عبارة عن خسارة قياسية Tensor (ليست قابلة للاستدعاء). العنصر الأول في القائمة التي يتم إرجاعها هو train_op/minimize_op المطلوب.
    • إذا كانت الخسارة قابلة للاستدعاء (مثل وظيفة) ، فاستخدم Optimizer.minimize للحصول على train_op/minimize_op .
  • استخدم tf.keras.metrics بدلاً من tf.compat.v1.metrics للتقييم.

بالنسبة للمثال أعلاه من my_model_fn ، يتم عرض الكود المرحّل برموز TensorFlow 2.x على النحو التالي:

def my_model_fn(features, labels, mode):
  model = make_model()

  training = (mode == tf.estimator.ModeKeys.TRAIN)
  loss_obj = tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True)
  predictions = model(features, training=training)

  # Get both the unconditional losses (the None part)
  # and the input-conditional losses (the features part).
  reg_losses = model.get_losses_for(None) + model.get_losses_for(features)
  total_loss=loss_obj(labels, predictions) + tf.math.add_n(reg_losses)

  # Upgrade to tf.keras.metrics.
  accuracy_obj = tf.keras.metrics.Accuracy(name='acc_obj')
  accuracy = accuracy_obj.update_state(
      y_true=labels, y_pred=tf.math.argmax(predictions, axis=1))

  train_op = None
  if training:
    # Upgrade to tf.keras.optimizers.
    optimizer = tf.keras.optimizers.Adam()
    # Manually assign tf.compat.v1.global_step variable to optimizer.iterations
    # to make tf.compat.v1.train.global_step increased correctly.
    # This assignment is a must for any `tf.train.SessionRunHook` specified in
    # estimator, as SessionRunHooks rely on global step.
    optimizer.iterations = tf.compat.v1.train.get_or_create_global_step()
    # Get both the unconditional updates (the None part)
    # and the input-conditional updates (the features part).
    update_ops = model.get_updates_for(None) + model.get_updates_for(features)
    # Compute the minimize_op.
    minimize_op = optimizer.get_updates(
        total_loss,
        model.trainable_variables)[0]
    train_op = tf.group(minimize_op, *update_ops)

  return tf.estimator.EstimatorSpec(
    mode=mode,
    predictions=predictions,
    loss=total_loss,
    train_op=train_op,
    eval_metric_ops={'Accuracy': accuracy_obj})

# Create the Estimator and train.
estimator = tf.estimator.Estimator(model_fn=my_model_fn)
tf.estimator.train_and_evaluate(estimator, train_spec, eval_spec)
INFO:tensorflow:Using default config.
INFO:tensorflow:Using default config.
WARNING:tensorflow:Using temporary folder as model directory: /tmp/tmpc93qfnv6
WARNING:tensorflow:Using temporary folder as model directory: /tmp/tmpc93qfnv6
INFO:tensorflow:Using config: {'_model_dir': '/tmp/tmpc93qfnv6', '_tf_random_seed': None, '_save_summary_steps': 100, '_save_checkpoints_steps': None, '_save_checkpoints_secs': 600, '_session_config': allow_soft_placement: true
graph_options {
  rewrite_options {
    meta_optimizer_iterations: ONE
  }
}
, '_keep_checkpoint_max': 5, '_keep_checkpoint_every_n_hours': 10000, '_log_step_count_steps': 100, '_train_distribute': None, '_device_fn': None, '_protocol': None, '_eval_distribute': None, '_experimental_distribute': None, '_experimental_max_worker_delay_secs': None, '_session_creation_timeout_secs': 7200, '_checkpoint_save_graph_def': True, '_service': None, '_cluster_spec': ClusterSpec({}), '_task_type': 'worker', '_task_id': 0, '_global_id_in_cluster': 0, '_master': '', '_evaluation_master': '', '_is_chief': True, '_num_ps_replicas': 0, '_num_worker_replicas': 1}
INFO:tensorflow:Using config: {'_model_dir': '/tmp/tmpc93qfnv6', '_tf_random_seed': None, '_save_summary_steps': 100, '_save_checkpoints_steps': None, '_save_checkpoints_secs': 600, '_session_config': allow_soft_placement: true
graph_options {
  rewrite_options {
    meta_optimizer_iterations: ONE
  }
}
, '_keep_checkpoint_max': 5, '_keep_checkpoint_every_n_hours': 10000, '_log_step_count_steps': 100, '_train_distribute': None, '_device_fn': None, '_protocol': None, '_eval_distribute': None, '_experimental_distribute': None, '_experimental_max_worker_delay_secs': None, '_session_creation_timeout_secs': 7200, '_checkpoint_save_graph_def': True, '_service': None, '_cluster_spec': ClusterSpec({}), '_task_type': 'worker', '_task_id': 0, '_global_id_in_cluster': 0, '_master': '', '_evaluation_master': '', '_is_chief': True, '_num_ps_replicas': 0, '_num_worker_replicas': 1}
INFO:tensorflow:Not using Distribute Coordinator.
INFO:tensorflow:Not using Distribute Coordinator.
INFO:tensorflow:Running training and evaluation locally (non-distributed).
INFO:tensorflow:Running training and evaluation locally (non-distributed).
INFO:tensorflow:Start train and evaluate loop. The evaluate will happen after every checkpoint. Checkpoint frequency is determined based on RunConfig arguments: save_checkpoints_steps None or save_checkpoints_secs 600.
INFO:tensorflow:Start train and evaluate loop. The evaluate will happen after every checkpoint. Checkpoint frequency is determined based on RunConfig arguments: save_checkpoints_steps None or save_checkpoints_secs 600.
INFO:tensorflow:Calling model_fn.
INFO:tensorflow:Calling model_fn.
INFO:tensorflow:Done calling model_fn.
INFO:tensorflow:Done calling model_fn.
INFO:tensorflow:Create CheckpointSaverHook.
INFO:tensorflow:Create CheckpointSaverHook.
INFO:tensorflow:Graph was finalized.
INFO:tensorflow:Graph was finalized.
INFO:tensorflow:Running local_init_op.
INFO:tensorflow:Running local_init_op.
INFO:tensorflow:Done running local_init_op.
INFO:tensorflow:Done running local_init_op.
INFO:tensorflow:Calling checkpoint listeners before saving checkpoint 0...
INFO:tensorflow:Calling checkpoint listeners before saving checkpoint 0...
INFO:tensorflow:Saving checkpoints for 0 into /tmp/tmpc93qfnv6/model.ckpt.
INFO:tensorflow:Saving checkpoints for 0 into /tmp/tmpc93qfnv6/model.ckpt.
INFO:tensorflow:Calling checkpoint listeners after saving checkpoint 0...
INFO:tensorflow:Calling checkpoint listeners after saving checkpoint 0...
INFO:tensorflow:loss = 2.5293791, step = 0
INFO:tensorflow:loss = 2.5293791, step = 0
INFO:tensorflow:Calling checkpoint listeners before saving checkpoint 25...
INFO:tensorflow:Calling checkpoint listeners before saving checkpoint 25...
INFO:tensorflow:Saving checkpoints for 25 into /tmp/tmpc93qfnv6/model.ckpt.
INFO:tensorflow:Saving checkpoints for 25 into /tmp/tmpc93qfnv6/model.ckpt.
INFO:tensorflow:Calling checkpoint listeners after saving checkpoint 25...
INFO:tensorflow:Calling checkpoint listeners after saving checkpoint 25...
INFO:tensorflow:Calling model_fn.
INFO:tensorflow:Calling model_fn.
INFO:tensorflow:Done calling model_fn.
INFO:tensorflow:Done calling model_fn.
INFO:tensorflow:Starting evaluation at 2021-01-06T02:31:24Z
INFO:tensorflow:Starting evaluation at 2021-01-06T02:31:24Z
INFO:tensorflow:Graph was finalized.
INFO:tensorflow:Graph was finalized.
INFO:tensorflow:Restoring parameters from /tmp/tmpc93qfnv6/model.ckpt-25
INFO:tensorflow:Restoring parameters from /tmp/tmpc93qfnv6/model.ckpt-25
INFO:tensorflow:Running local_init_op.
INFO:tensorflow:Running local_init_op.
INFO:tensorflow:Done running local_init_op.
INFO:tensorflow:Done running local_init_op.
INFO:tensorflow:Evaluation [1/5]
INFO:tensorflow:Evaluation [1/5]
INFO:tensorflow:Evaluation [2/5]
INFO:tensorflow:Evaluation [2/5]
INFO:tensorflow:Evaluation [3/5]
INFO:tensorflow:Evaluation [3/5]
INFO:tensorflow:Evaluation [4/5]
INFO:tensorflow:Evaluation [4/5]
INFO:tensorflow:Evaluation [5/5]
INFO:tensorflow:Evaluation [5/5]
INFO:tensorflow:Inference Time : 0.86534s
INFO:tensorflow:Inference Time : 0.86534s
INFO:tensorflow:Finished evaluation at 2021-01-06-02:31:25
INFO:tensorflow:Finished evaluation at 2021-01-06-02:31:25
INFO:tensorflow:Saving dict for global step 25: Accuracy = 0.59375, global_step = 25, loss = 1.7570661
INFO:tensorflow:Saving dict for global step 25: Accuracy = 0.59375, global_step = 25, loss = 1.7570661
INFO:tensorflow:Saving 'checkpoint_path' summary for global step 25: /tmp/tmpc93qfnv6/model.ckpt-25
INFO:tensorflow:Saving 'checkpoint_path' summary for global step 25: /tmp/tmpc93qfnv6/model.ckpt-25
INFO:tensorflow:Loss for final step: 0.47094986.
INFO:tensorflow:Loss for final step: 0.47094986.
({'Accuracy': 0.59375, 'loss': 1.7570661, 'global_step': 25}, [])

مقدرات مسبقة

ولم يضف المقدرون في عائلة tf.estimator.DNN* ، tf.estimator.Linear* و tf.estimator.DNNLinearCombined* لا تزال معتمدة في API TensorFlow الإصدار 2.x. ومع ذلك ، فقد تغيرت بعض الحجج:

  1. input_layer_partitioner : تمت الإزالة في الإصدار 2.
  2. loss_reduction : تم التحديث إلى tf.keras.losses.Reduction بدلاً من tf.compat.v1.losses.Reduction . تم تغيير قيمته الافتراضية أيضًا إلى tf.keras.losses.Reduction.SUM_OVER_BATCH_SIZE من tf.compat.v1.losses.Reduction.SUM .
  3. optimizer ، dnn_optimizer و linear_optimizer : تم تحديث هذه الحجة ل tf.keras.optimizers بدلا من tf.compat.v1.train.Optimizer .

لترحيل التغييرات أعلاه:

  1. لا حاجة إلى input_layer_partitioner نظرًا لأن Distribution Strategy ستتعامل معها تلقائيًا في TensorFlow 2.x.
  2. بالنسبة إلى loss_reduction ، تحقق من tf.keras.losses.Reduction للحصول على الخيارات المدعومة.
  3. بالنسبة إلى وسيطات optimizer :
    • إذا كنت لا: 1) تمر في optimizer ، dnn_optimizer أو linear_optimizer حجة، أو 2) تحديد optimizer الحجة باعتباره string في التعليمات البرمجية الخاصة بك، فإنك لا تحتاج إلى تغيير أي شيء لأن tf.keras.optimizers يستخدم بشكل افتراضي .
    • خلاف ذلك ، تحتاج إلى تحديثه من tf.compat.v1.train.Optimizer إلى tf.keras.optimizers المقابل tf.keras.optimizers .

محول نقطة التفتيش

سيؤدي الترحيل إلى keras.optimizers إلى كسر نقاط التفتيش المحفوظة باستخدام TensorFlow 1.x ، حيث يولد tf.keras.optimizers مجموعة مختلفة من المتغيرات ليتم حفظها في نقاط التفتيش. لجعل نقطة التفتيش القديمة قابلة لإعادة الاستخدام بعد الترحيل إلى TensorFlow 2.x ، جرب أداة محول نقاط التفتيش .

 curl -O https://raw.githubusercontent.com/tensorflow/estimator/master/tensorflow_estimator/python/estimator/tools/checkpoint_converter.py
% Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 15165  100 15165    0     0  40656      0 --:--:-- --:--:-- --:--:-- 40656

تحتوي الأداة على مساعدة مضمنة:

 python checkpoint_converter.py -h
2021-01-06 02:31:26.297951: I tensorflow/stream_executor/platform/default/dso_loader.cc:49] Successfully opened dynamic library libcudart.so.11.0
usage: checkpoint_converter.py [-h]
                               {dnn,linear,combined} source_checkpoint
                               source_graph target_checkpoint

positional arguments:
  {dnn,linear,combined}
                        The type of estimator to be converted. So far, the
                        checkpoint converter only supports Canned Estimator.
                        So the allowed types include linear, dnn and combined.
  source_checkpoint     Path to source checkpoint file to be read in.
  source_graph          Path to source graph file to be read in.
  target_checkpoint     Path to checkpoint file to be written out.

optional arguments:
  -h, --help            show this help message and exit

تينسورشيب

تم تبسيط هذه الفئة tf.compat.v1.Dimension على int s ، بدلاً من tf.compat.v1.Dimension كائنات. لذلك ليست هناك حاجة لاستدعاء .value للحصول على عدد int .

يمكن الوصول إلى كائنات tf.compat.v1.Dimension الفردية tf.TensorShape.dims . من tf.TensorShape.dims .

يوضح ما يلي الاختلافات بين TensorFlow 1.x و TensorFlow 2.x.

# Create a shape and choose an index
i = 0
shape = tf.TensorShape([16, None, 256])
shape
TensorShape([16, None, 256])

إذا كان لديك هذا في TensorFlow 1.x:

value = shape[i].value

ثم افعل ذلك في TensorFlow 2.x:

value = shape[i]
value
16

إذا كان لديك هذا في TensorFlow 1.x:

for dim in shape:
    value = dim.value
    print(value)

ثم افعل ذلك في TensorFlow 2.x:

for value in shape:
  print(value)
16
None
256

إذا كان لديك هذا في TensorFlow 1.x (أو استخدمت أي طريقة أبعاد أخرى):

dim = shape[i]
dim.assert_is_compatible_with(other_dim)

ثم افعل ذلك في TensorFlow 2.x:

other_dim = 16
Dimension = tf.compat.v1.Dimension

if shape.rank is None:
  dim = Dimension(None)
else:
  dim = shape.dims[i]
dim.is_compatible_with(other_dim) # or any other dimension method
True
shape = tf.TensorShape(None)

if shape:
  dim = shape.dims[i]
  dim.is_compatible_with(other_dim) # or any other dimension method

تكون القيمة المنطقية لـ tf.TensorShape True إذا كانت الرتبة معروفة ، False بخلاف ذلك.

print(bool(tf.TensorShape([])))      # Scalar
print(bool(tf.TensorShape([0])))     # 0-length vector
print(bool(tf.TensorShape([1])))     # 1-length vector
print(bool(tf.TensorShape([None])))  # Unknown-length vector
print(bool(tf.TensorShape([1, 10, 100])))       # 3D tensor
print(bool(tf.TensorShape([None, None, None]))) # 3D tensor with no known dimensions
print()
print(bool(tf.TensorShape(None)))  # A tensor with unknown rank.
True
True
True
True
True
True

False

تغييرات أخرى

  • إزالة tf.colocate_with : لقد تحسنت خوارزميات وضع جهاز TensorFlow بشكل ملحوظ لم يعد هذا ضروريا. إذا تسببت إزالته في تدهور الأداء ، يرجى تقديم خطأ .

  • استبدل استخدام v1.ConfigProto بالوظائف المكافئة من tf.config .

الاستنتاجات

العملية الشاملة هي:

  1. قم بتشغيل البرنامج النصي للترقية.
  2. إزالة رموز المساهمين.
  3. قم بتبديل النماذج الخاصة بك إلى نمط موجه للكائنات (Keras).
  4. استخدم tf.keras التدريب والتقييم tf.keras أو tf.estimator حيث يمكنك ذلك.
  5. بخلاف ذلك ، استخدم الحلقات المخصصة ، ولكن تأكد من تجنب الجلسات والمجموعات.

يتطلب تحويل التعليمات البرمجية إلى TensorFlow 2.x الاصطلاحية القليل من العمل ، ولكن كل تغيير ينتج عنه:

  • سطور أقل من التعليمات البرمجية.
  • زيادة الوضوح والبساطة.
  • تصحيح أخطاء أسهل.