ترجمت واجهة Cloud Translation API‏ هذه الصفحة.
Switch to English

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

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

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

لا يزال من الممكن تشغيل كود 1.X ، غير معدل ( باستثناء المساهمات) ، في TensorFlow 2.0:

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

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

نص التحويل التلقائي

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

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

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

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

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

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

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

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

اجعل الكود 2.0 أصليًا

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

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

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

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

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

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

لاحظ أن:

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

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

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

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

لا يُنصح بشدة بتتبع المتغير المستند إلى الاسم في TF 2.0. استخدم كائنات 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 الكامل ، مع دلالاتها الأصلية.

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

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

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

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

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

  • استخدام نطاقات متغيرة للتحكم في إعادة الاستخدام
  • إنشاء متغيرات باستخدام 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)
WARNING:tensorflow:From <ipython-input-1-1c8189d0d453>:4: conv2d (from tensorflow.python.keras.legacy_tf_layers.convolutional) is deprecated and will be removed in a future version.
Instructions for updating:
Use `tf.keras.layers.Conv2D` instead.
WARNING:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.6/site-packages/tensorflow/python/keras/legacy_tf_layers/convolutional.py:424: Layer.apply (from tensorflow.python.keras.engine.base_layer) is deprecated and will be removed in a future version.
Instructions for updating:
Please use `layer.__call__` method instead.
WARNING:tensorflow:From <ipython-input-1-1c8189d0d453>:5: max_pooling2d (from tensorflow.python.keras.legacy_tf_layers.pooling) is deprecated and will be removed in a future version.
Instructions for updating:
Use keras.layers.MaxPooling2D instead.
WARNING:tensorflow:From <ipython-input-1-1c8189d0d453>:6: flatten (from tensorflow.python.keras.legacy_tf_layers.core) is deprecated and will be removed in a future version.
Instructions for updating:
Use keras.layers.Flatten instead.
WARNING:tensorflow:From <ipython-input-1-1c8189d0d453>:7: dropout (from tensorflow.python.keras.legacy_tf_layers.core) is deprecated and will be removed in a future version.
Instructions for updating:
Use keras.layers.dropout instead.
WARNING:tensorflow:From <ipython-input-1-1c8189d0d453>:8: dense (from tensorflow.python.keras.legacy_tf_layers.core) is deprecated and will be removed in a future version.
Instructions for updating:
Use keras.layers.Dense instead.
WARNING:tensorflow:From <ipython-input-1-1c8189d0d453>:9: batch_normalization (from tensorflow.python.keras.legacy_tf_layers.normalization) is deprecated and will be removed in a future version.
Instructions for updating:
Use 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.Tensor([[0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]], shape=(1, 10), dtype=float32)

tf.Tensor(
[[ 0.07562444 -0.27538717  0.21692204  0.2411264  -0.01209673 -0.0923705
   0.19058049 -0.00468709 -0.17215249 -0.07528099]], shape=(1, 10), dtype=float32)

بعد التحويل

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

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

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

  • إذا كنت تستخدم أدوات 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.32132083  0.22252844 -0.11330387 -0.4613616  -0.08817139 -0.52697927
  -0.1538124   0.23069203 -0.15860984 -0.453844  ]], 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.08671833>]

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

غالبًا ما تمزج الشفرة الحالية بين متغيرات TF 1.x ذات المستوى v1.layers والعمليات مع 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 ، أجهزة tf.Tensors هي فقط للقيم الوسيطة.

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

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

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

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

تدريب

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

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

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

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

تحتوي حزمة TensorFlow Datasets ( 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']
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 [==============================] - 0s 6ms/step - loss: 1.5665 - accuracy: 0.4969
Epoch 2/5
5/5 [==============================] - 0s 6ms/step - loss: 0.5249 - accuracy: 0.8656
Epoch 3/5
5/5 [==============================] - 0s 5ms/step - loss: 0.3246 - accuracy: 0.9438
Epoch 4/5
5/5 [==============================] - 0s 6ms/step - loss: 0.2407 - accuracy: 0.9719
Epoch 5/5
5/5 [==============================] - 0s 5ms/step - loss: 0.1841 - accuracy: 0.9906
5/5 [==============================] - 0s 4ms/step - loss: 1.5957 - accuracy: 0.5375
Loss 1.5956770181655884, Accuracy 0.5375000238418579

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

إذا كانت خطوة تدريب نموذج 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.145 accuracy: 1.000
train:  loss: 0.183 accuracy: 0.984
train:  loss: 0.216 accuracy: 0.953
train:  loss: 0.229 accuracy: 0.938
train:  loss: 0.201 accuracy: 0.969

eval:  loss: 1.588 accuracy: 0.628
train:  loss: 0.097 accuracy: 1.000
train:  loss: 0.101 accuracy: 1.000
train:  loss: 0.086 accuracy: 1.000
train:  loss: 0.130 accuracy: 0.984
train:  loss: 0.127 accuracy: 1.000

eval:  loss: 1.580 accuracy: 0.766
train:  loss: 0.086 accuracy: 1.000
train:  loss: 0.081 accuracy: 1.000
train:  loss: 0.079 accuracy: 1.000
train:  loss: 0.076 accuracy: 1.000
train:  loss: 0.077 accuracy: 1.000

eval:  loss: 1.542 accuracy: 0.809
train:  loss: 0.067 accuracy: 1.000
train:  loss: 0.068 accuracy: 1.000
train:  loss: 0.063 accuracy: 1.000
train:  loss: 0.063 accuracy: 1.000
train:  loss: 0.056 accuracy: 1.000

eval:  loss: 1.503 accuracy: 0.816
train:  loss: 0.055 accuracy: 1.000
train:  loss: 0.056 accuracy: 1.000
train:  loss: 0.048 accuracy: 1.000
train:  loss: 0.051 accuracy: 1.000
train:  loss: 0.048 accuracy: 1.000

eval:  loss: 1.482 accuracy: 0.828

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

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

  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.0 ، تعتبر المقاييس والخسائر كائنات. هذه تعمل بفارغ الصبر وفي tf.function .

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

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

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

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

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

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

# 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.207
  accuracy: 0.991
Epoch:  1
  loss:     0.167
  accuracy: 0.994
Epoch:  2
  loss:     0.147
  accuracy: 0.997
Epoch:  3
  loss:     0.123
  accuracy: 0.997
Epoch:  4
  loss:     0.109
  accuracy: 0.997

أسماء مترية Keras

في TensorFlow 2.0 keras ، تكون نماذج keras أكثر اتساقًا في التعامل مع الأسماء المترية.

الآن عند تمرير سلسلة في قائمة المقاييس، أن يتم استخدام سلسلة بالضبط مقياسا ل name . تظهر هذه الأسماء في كائن المحفوظات model.fit بواسطة 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 [==============================] - 0s 6ms/step - loss: 0.1233 - acc: 0.9937 - accuracy: 0.9937 - my_accuracy: 0.9937

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 تغييرات كبيرة في tf.summary API المستخدمة لكتابة بيانات موجزة للتصور في TensorBoard. للحصول على مقدمة عامة tf.summary الجديد ، هناك العديد من البرامج التعليمية المتاحة التي تستخدم TF 2 API. يتضمن هذا دليل ترحيل TensorBoard TF 2

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

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

يستخدم TensorFlow 2.0 نقاط فحص قائمة على الكائنات .

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

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

  • لا تزال جميع المتغيرات تحتوي على وسيطة 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.0. أفضل رهان لك هو ترقية الكود الذي أنشأ الملف.

ولكن ، إذا كان لديك "رسم بياني مجمد" (رسم بياني tf.Graph حيث تم تحويل المتغيرات إلى ثوابت) ، فمن الممكن تحويل هذا إلى v1.wrap_function 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.0.

عند استخدام المقدرات ، يمكنك استخدام 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 & 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.0.

نوصي بتحديد نموذجك باستخدام 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/tmp333woaev

Warning:tensorflow:Using temporary folder as model directory: /tmp/tmp333woaev

INFO:tensorflow:Using the Keras model provided.

INFO:tensorflow:Using the Keras model provided.

Warning:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.6/site-packages/tensorflow_estimator/python/estimator/keras.py:220: set_learning_phase (from tensorflow.python.keras.backend) is deprecated and will be removed after 2020-10-11.
Instructions for updating:
Simply pass a True/False value to the `training` argument of the `__call__` method of your layer or model.

Warning:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.6/site-packages/tensorflow_estimator/python/estimator/keras.py:220: set_learning_phase (from tensorflow.python.keras.backend) is deprecated and will be removed after 2020-10-11.
Instructions for updating:
Simply pass a True/False value to the `training` argument of the `__call__` method of your layer or model.

INFO:tensorflow:Using config: {'_model_dir': '/tmp/tmp333woaev', '_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, '_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/tmp333woaev', '_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, '_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/tmp333woaev/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/tmp333woaev/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/tmp333woaev/keras/keras_model.ckpt

INFO:tensorflow:Warm-starting from: /tmp/tmp333woaev/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/tmp333woaev/model.ckpt.

INFO:tensorflow:Saving checkpoints for 0 into /tmp/tmp333woaev/model.ckpt.

INFO:tensorflow:Calling checkpoint listeners after saving checkpoint 0...

INFO:tensorflow:Calling checkpoint listeners after saving checkpoint 0...

INFO:tensorflow:loss = 2.946777, step = 0

INFO:tensorflow:loss = 2.946777, 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/tmp333woaev/model.ckpt.

INFO:tensorflow:Saving checkpoints for 25 into /tmp/tmp333woaev/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.

Warning:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.6/site-packages/tensorflow/python/keras/engine/training_v1.py:2048: Model.state_updates (from tensorflow.python.keras.engine.training) is deprecated and will be removed in a future version.
Instructions for updating:
This property should not be used in TensorFlow 2.0, as updates are applied automatically.

Warning:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.6/site-packages/tensorflow/python/keras/engine/training_v1.py:2048: Model.state_updates (from tensorflow.python.keras.engine.training) is deprecated and will be removed in a future version.
Instructions for updating:
This property should not be used in TensorFlow 2.0, as updates are applied automatically.

INFO:tensorflow:Done calling model_fn.

INFO:tensorflow:Done calling model_fn.

INFO:tensorflow:Starting evaluation at 2020-10-15T01:27:37Z

INFO:tensorflow:Starting evaluation at 2020-10-15T01:27:37Z

INFO:tensorflow:Graph was finalized.

INFO:tensorflow:Graph was finalized.

INFO:tensorflow:Restoring parameters from /tmp/tmp333woaev/model.ckpt-25

INFO:tensorflow:Restoring parameters from /tmp/tmp333woaev/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.84716s

INFO:tensorflow:Inference Time : 0.84716s

INFO:tensorflow:Finished evaluation at 2020-10-15-01:27:38

INFO:tensorflow:Finished evaluation at 2020-10-15-01:27:38

INFO:tensorflow:Saving dict for global step 25: accuracy = 0.715625, global_step = 25, loss = 1.5356585

INFO:tensorflow:Saving dict for global step 25: accuracy = 0.715625, global_step = 25, loss = 1.5356585

INFO:tensorflow:Saving 'checkpoint_path' summary for global step 25: /tmp/tmp333woaev/model.ckpt-25

INFO:tensorflow:Saving 'checkpoint_path' summary for global step 25: /tmp/tmp333woaev/model.ckpt-25

INFO:tensorflow:Loss for final step: 0.52498615.

INFO:tensorflow:Loss for final step: 0.52498615.

({'accuracy': 0.715625, 'loss': 1.5356585, 'global_step': 25}, [])

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

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

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

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

لجعل model_fn المخصص الخاص بك يعمل في TF 2.0 ، إذا كنت تفضل الحد الأدنى من التغييرات على الكود الحالي ، 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/tmpnhx_c2r_

Warning:tensorflow:Using temporary folder as model directory: /tmp/tmpnhx_c2r_

INFO:tensorflow:Using config: {'_model_dir': '/tmp/tmpnhx_c2r_', '_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, '_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/tmpnhx_c2r_', '_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, '_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/tmpnhx_c2r_/model.ckpt.

INFO:tensorflow:Saving checkpoints for 0 into /tmp/tmpnhx_c2r_/model.ckpt.

INFO:tensorflow:Calling checkpoint listeners after saving checkpoint 0...

INFO:tensorflow:Calling checkpoint listeners after saving checkpoint 0...

INFO:tensorflow:loss = 2.7539256, step = 0

INFO:tensorflow:loss = 2.7539256, 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/tmpnhx_c2r_/model.ckpt.

INFO:tensorflow:Saving checkpoints for 25 into /tmp/tmpnhx_c2r_/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 2020-10-15T01:27:41Z

INFO:tensorflow:Starting evaluation at 2020-10-15T01:27:41Z

INFO:tensorflow:Graph was finalized.

INFO:tensorflow:Graph was finalized.

INFO:tensorflow:Restoring parameters from /tmp/tmpnhx_c2r_/model.ckpt-25

INFO:tensorflow:Restoring parameters from /tmp/tmpnhx_c2r_/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.94175s

INFO:tensorflow:Inference Time : 0.94175s

INFO:tensorflow:Finished evaluation at 2020-10-15-01:27:42

INFO:tensorflow:Finished evaluation at 2020-10-15-01:27:42

INFO:tensorflow:Saving dict for global step 25: accuracy = 0.678125, global_step = 25, loss = 1.5622549

INFO:tensorflow:Saving dict for global step 25: accuracy = 0.678125, global_step = 25, loss = 1.5622549

INFO:tensorflow:Saving 'checkpoint_path' summary for global step 25: /tmp/tmpnhx_c2r_/model.ckpt-25

INFO:tensorflow:Saving 'checkpoint_path' summary for global step 25: /tmp/tmpnhx_c2r_/model.ckpt-25

INFO:tensorflow:Loss for final step: 0.39462265.

INFO:tensorflow:Loss for final step: 0.39462265.

({'accuracy': 0.678125, 'loss': 1.5622549, 'global_step': 25}, [])

model_fn مخصص model_fn TF 2.0

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

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

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

9 ديسمبر 850515
INFO:tensorflow:Using default config.

INFO:tensorflow:Using default config.

Warning:tensorflow:Using temporary folder as model directory: /tmp/tmp3kddt__h

Warning:tensorflow:Using temporary folder as model directory: /tmp/tmp3kddt__h

INFO:tensorflow:Using config: {'_model_dir': '/tmp/tmp3kddt__h', '_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, '_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/tmp3kddt__h', '_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, '_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/tmp3kddt__h/model.ckpt.

INFO:tensorflow:Saving checkpoints for 0 into /tmp/tmp3kddt__h/model.ckpt.

INFO:tensorflow:Calling checkpoint listeners after saving checkpoint 0...

INFO:tensorflow:Calling checkpoint listeners after saving checkpoint 0...

INFO:tensorflow:loss = 2.4914804, step = 0

INFO:tensorflow:loss = 2.4914804, 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/tmp3kddt__h/model.ckpt.

INFO:tensorflow:Saving checkpoints for 25 into /tmp/tmp3kddt__h/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 2020-10-15T01:27:45Z

INFO:tensorflow:Starting evaluation at 2020-10-15T01:27:45Z

INFO:tensorflow:Graph was finalized.

INFO:tensorflow:Graph was finalized.

INFO:tensorflow:Restoring parameters from /tmp/tmp3kddt__h/model.ckpt-25

INFO:tensorflow:Restoring parameters from /tmp/tmp3kddt__h/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.91708s

INFO:tensorflow:Inference Time : 0.91708s

INFO:tensorflow:Finished evaluation at 2020-10-15-01:27:46

INFO:tensorflow:Finished evaluation at 2020-10-15-01:27:46

INFO:tensorflow:Saving dict for global step 25: Accuracy = 0.690625, global_step = 25, loss = 1.554177

INFO:tensorflow:Saving dict for global step 25: Accuracy = 0.690625, global_step = 25, loss = 1.554177

INFO:tensorflow:Saving 'checkpoint_path' summary for global step 25: /tmp/tmp3kddt__h/model.ckpt-25

INFO:tensorflow:Saving 'checkpoint_path' summary for global step 25: /tmp/tmp3kddt__h/model.ckpt-25

INFO:tensorflow:Loss for final step: 0.3999393.

INFO:tensorflow:Loss for final step: 0.3999393.

({'Accuracy': 0.690625, 'loss': 1.554177, 'global_step': 25}, [])

مقدرات مسبقة

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

  1. input_layer_partitioner : تمت إزالته في 2.0.
  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.keras.optimizers بدلاً من tf.compat.v1.train.Optimizer .

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

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

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

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

 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  32265      0 --:--:-- --:--:-- --:--:-- 32197

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

 python checkpoint_converter.py -h
2020-10-15 01:27:47.423752: I tensorflow/stream_executor/platform/default/dso_loader.cc:48] Successfully opened dynamic library libcudart.so.10.1
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.0.

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

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

value = shape[i].value

ثم افعل ذلك في TF 2.0:

value = shape[i]
value
16

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

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

ثم افعل ذلك في TF 2.0:

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

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

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

ثم افعل ذلك في TF 2.0:

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.0 الاصطلاحية القليل من العمل ، ولكن كل تغيير ينتج عنه:

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