تاریخ را ذخیره کنید! Google I / O 18-20 مه بازمی گردد اکنون ثبت نام کنید
این صفحه به‌وسیله ‏Cloud Translation API‏ ترجمه شده است.
Switch to English

کد TensorFlow 1 خود را به TensorFlow 2 منتقل کنید

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

این راهنما برای کاربران API های سطح پایین TensorFlow است. اگر از API های سطح بالا ( 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 ارتقا دهید ، اما نمی تواند کد شما را به v2 تبدیل کند. کد شما ممکن است همچنان از نقاط انتهایی tf.compat.v1 برای دسترسی به متغیرهایی ، جلسات ، مجموعه ها و سایر قابلیت های سبک 1.x استفاده کند.

تغییرات رفتاری سطح بالا

اگر کد شما با استفاده از tf.compat.v1.disable_v2_behavior 2.x کار می کند ، باز هم ممکن است نیاز به تغییرات کلی در رفتار داشته باشید. تغییرات عمده عبارتند از:

  • اجرای مشتاق ، v1.enable_eager_execution() : هر کدی که به طور ضمنی از tf.Graph استفاده کند ، tf.Graph شکست می خورد. حتماً این کد را در متن with tf.Graph().as_default() قرار دهید.

  • Resource variables، v1.enable_resource_variables() : برخی از کدها ممکن است به رفتارهای غیر قطعی فعال شده توسط متغیرهای مرجع v1.enable_resource_variables() بستگی داشته باشد. متغیرهای منبع هنگام نوشتن قفل می شوند و بنابراین تضمین های سازگاری بصری بیشتری ارائه می دهند.

    • این ممکن است رفتار را در موارد لبه تغییر دهد.
    • این ممکن است نسخه های اضافی ایجاد کند و می تواند از حافظه بیشتری استفاده کند.
    • این را می توان با استفاده از use_resource=False به سازنده tf.Variable .
  • اشکال تنسور ، v1.enable_v2_tensorshape() : TensorFlow 2.x رفتار اشکال تنسور را ساده می کند. به جای t.shape[0].value می توانید t.shape[0] بگویید. این تغییرات باید کم باشد ، و منطقی است که بلافاصله آنها را برطرف کنید. برای مثال به بخش TensorShape مراجعه کنید.

  • کنترل جریان ، v1.enable_control_flow_v2() : اجرای جریان کنترل v1.enable_control_flow_v2() 2.x ساده شده است ، و به همین ترتیب نمایش های مختلف v1.enable_control_flow_v2() تولید می شود. لطفاً برای هرگونه مشکل اشکالات خود را وارد کنید.

برای TensorFlow کد 2.x ایجاد کنید

این راهنما چندین نمونه از تبدیل کد TensorFlow 1.x به TensorFlow 2.x را مرور می کند. این تغییرات باعث می شود که کد شما از بهینه سازی عملکرد و تماس های API ساده استفاده کند.

در هر حالت ، الگوی زیر است:

1. تماس های v1.Session.run جایگزین کنید

هر تماس v1.Session.run باید با یک تابع Python جایگزین شود.

  • feed_dict و v1.placeholder به آرگومان های عملکرد تبدیل می شوند.
  • fetches به مقدار برگشتی تابع تبدیل می شوند.
  • در حین تبدیل ، اجرای مشتاقانه امکان اشکال زدایی آسان با ابزارهای استاندارد Python مانند pdb فراهم می کند.

پس از آن ، یک تزئین کننده tf.function اضافه کنید تا در نمودار به صورت کارآمد اجرا شود. برای کسب اطلاعات بیشتر در مورد چگونگی عملکرد ، به راهنمای Autograph مراجعه کنید.

توجه داشته باشید که:

  • بر خلاف v1.Session.run ، یک tf.function امضای برگشت ثابت دارد و همیشه همه خروجی ها را برمی گرداند. اگر این امر باعث بروز مشکلات عملکردی می شود ، دو عملکرد جداگانه ایجاد کنید.

  • دیگر نیازی به tf.control_dependencies یا عملیات مشابه نیست: عملکرد tf.function به گونه ای رفتار می کند که گویی به ترتیب نوشته شده اجرا شده است. tf.Variable تکالیف tf.Variable و tf.assert s ، به عنوان مثال ، به طور خودکار اجرا می شوند.

بخش مدل های تبدیل شده حاوی یک نمونه کار از این فرآیند تبدیل است.

2. از اشیا Py پایتون برای ردیابی متغیرها و تلفات استفاده کنید

همه ردیابی متغیرهای مبتنی بر نام در TensorFlow 2.x به شدت دلسرد می شوند. برای ردیابی متغیرها از اشیا Py پایتون استفاده کنید.

استفاده از tf.Variable جای v1.get_variable .

هر v1.variable_scope باید به یک شی Python تبدیل شود. به طور معمول این یکی از موارد زیر خواهد بود:

اگر می خواهید لیست متغیرها را جمع کنید (مانند tf.Graph.get_collection(tf.GraphKeys.VARIABLES) ) ، از ویژگی های .variables و .trainable_variables Layer و Model استفاده کنید.

این کلاسهای Layer و Model چندین ویژگی دیگر را نیز پیاده سازی می کنند که نیاز به مجموعه های جهانی را از بین می برند. خاصیت .losses آنها می تواند جایگزینی برای استفاده از مجموعه tf.GraphKeys.LOSSES باشد.

برای جزئیات بیشتر به راهنماهای Keras مراجعه کنید.

3. حلقه های آموزش خود را ارتقا دهید

از API بالاترین سطح که برای موارد استفاده شما مناسب است استفاده کنید. tf.keras.Model.fit بر ساخت حلقه های آموزشی خود ترجیح دهید.

این توابع سطح بالا بسیاری از جزئیات سطح پایین را مدیریت می کند که اگر نوشتن حلقه آموزش خود باشید ، فراموش کردن از آنها آسان است. به عنوان مثال ، آنها به طور خودکار ضررهای منظم سازی را جمع می کنند و هنگام فراخوانی مدل ، training=True آرگومان training=True را تنظیم می کنند.

4. خطوط ورودی داده خود را ارتقا دهید

برای ورود داده از مجموعه داده tf.data استفاده کنید. این اشیا efficient کارآمد ، رسا هستند و به خوبی با جریان تنش ادغام می شوند.

آنها می توانند مستقیماً به روش tf.keras.Model.fit .

model.fit(dataset, epochs=5)

می توان آنها را از پایتون مستقیم تکرار کرد:

for example_batch, label_batch in dataset:
    break

5. از نمادهای compat.v1 مهاجرت کنید

ماژول tf.compat.v1 شامل API کامل TensorFlow 1.x با معنی شناسی اصلی آن است.

اسکریپت ارتقا T TensorFlow 2.x در صورت بی خطر بودن تبدیل ، نمادها را به معادل v2 تبدیل می کند ، یعنی اگر بتواند تعیین کند که رفتار نسخه TensorFlow 2.x دقیقاً معادل است (به عنوان مثال ، به v1.arg_max تغییر نام می دهد به tf.argmax ، از آنجا که عملکردهای مشابه هستند).

بعد از اینکه اسکریپت ارتقا با یک قطعه کد انجام شد ، احتمالاً موارد زیادی از compat.v1 ذکر شده است. ارزش آن است که از طریق کد وارد شوید و این موارد را به صورت دستی به معادل v2 تبدیل کنید (اگر کدی وجود دارد باید در آن ذکر شود).

تبدیل مدل ها

متغیرهای سطح پایین و اجرای اپراتور

نمونه هایی از استفاده از سطح پایین API شامل موارد زیر است:

  • استفاده از دامنه های متغیر برای کنترل استفاده مجدد.
  • ایجاد متغیرها با 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

پس از تبدیل

در کد تبدیل شده:

  • متغیرها اشیا local محلی پایتون هستند.
  • تابع forward هنوز محاسبه را تعریف می کند.
  • تماس Session.run با یک تماس برای forward جایگزین می شود.
  • دکوراتور اختیاری 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.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 ) از بین رفته است. این به این دلیل است که لایه های شی object مدل را از فراخوانی مدل جدا می کنند.

همچنین توجه داشته باشید که:

  • اگر از تنظیم کننده ها یا تنظیم کننده های اولیه tf.contrib ، این تغییرات نسبت به سایرین بیشتر است.
  • کد دیگر برای مجموعه ها نمی نویسد ، بنابراین توابعی مانند 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 بازنویسی کنید. برای کسب اطلاعات بیشتر ، از طریق راهنمای زیر طبقه بندی ساخت لایه ها و مدل های جدید را بررسی کنید.

# 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
    • گاهی اوقات یک بولی پایتون است
  • با استفاده از `self.add_weight متغیرهای مدل را در سازنده یا Model.build :

    • در Model.build به شکل ورودی دسترسی دارید ، بنابراین می توانید وزنه هایی با شکل مطابق ایجاد کنید
    • استفاده از tf.keras.layers.Layer.add_weight به Keras اجازه می دهد تا متغیرها و ضایعات نظم را ردیابی کند
  • tf.Tensors در اشیا your خود نگه tf.Tensors :

    • آنها ممکن است در یک tf.function یا در زمینه مشتاق ایجاد شوند و این حسگرها رفتار متفاوتی دارند
    • برای حالت از tf.Variable استفاده کنید ، آنها همیشه از هر دو زمینه قابل استفاده هستند
    • tf.Tensors فقط برای مقادیر متوسط ​​هستند

یادداشتی در مورد Slim and contrib.layers

مقدار زیادی از کد قدیمی TensorFlow 1.x از کتابخانه Slim استفاده می کند که با tf.contrib.layers 1.x به عنوان tf.contrib.layers بسته بندی شده است. به عنوان یک contrib ماژول، این است که دیگر در نسخه 2.x TensorFlow دسترس است، حتی در tf.compat.v1 . تبدیل کد با استفاده از Slim به TensorFlow 2.x بیشتر از تبدیل مخازنی است که از v1.layers استفاده می v1.layers . در حقیقت ، ممکن است منطقی باشد که ابتدا کد Slim خود را به v1.layers تبدیل کنید ، سپس به Keras تبدیل کنید.

  • arg_scopes حذف کنید ، همه arg_scopes باید صریح باشند.
  • اگر از آنها استفاده می کنید ، normalizer_fn و activation_fn را به لایه های خود تقسیم کنید.
  • لایه های کنگره قابل تفکیک به یک یا چند لایه مختلف Keras ترسیم می شوند (لایه های Keras به صورت عمقی ، نقطه ای و قابل تفکیک).
  • v1.layers Slim و v1.layers دارای نام آرگومان و مقادیر پیش فرض متفاوتی هستند.
  • برخی از کمان ها مقیاس های مختلفی دارند.
  • اگر از مدل های آموزش دیده باریک استفاده می کنید ، مدلهای Keras را که از قبل آماده شده اند از tf.keras.applications یا TF Hub 's TensorFlow 2.x SavedModels صادر شده از کد Slim اصلی امتحان کنید.

برخی از لایه های tf.contrib ممکن است به هسته TensorFlow منتقل نشده باشند اما در عوض به بسته TensorFlow Addons منتقل شده اند.

آموزش

روش های زیادی برای تغذیه داده ها به مدل tf.keras دارد. آنها ژنراتورهای پایتون و آرایه های Numpy را به عنوان ورودی می پذیرند.

روش توصیه شده برای تغذیه داده ها به یک مدل ، استفاده از بسته tf.data است که شامل مجموعه ای از کلاسهای با کارایی بالا برای دستکاری داده ها است.

اگر هنوز از tf.queue استفاده می tf.queue ، اینها اکنون فقط به عنوان ساختار داده پشتیبانی می شوند نه به عنوان خطوط لوله ورودی.

با استفاده از مجموعه داده های TensorFlow

بسته tfds Datasets ( tfds ) شامل برنامه های 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))

از حلقه های آموزش کراس استفاده کنید

اگر به کنترل سطح پایین فرایند آموزش خود نیازی ندارید ، استفاده از fit Keras ، evaluate و predict توصیه می شود. این روش ها یک رابط یکنواخت برای آموزش مدل بدون توجه به اجرا (ترتیبی ، عملکردی یا طبقه بندی فرعی) فراهم می کنند.

از مزایای این روشها می توان به موارد زیر اشاره کرد:

در اینجا مثالی از آموزش مدل با استفاده از 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.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. برای به دست آوردن دسته ای از مثالها ، از یک مولد پایتون یاtf.data.Dataset کنید.
  2. برای جمع كردن شیب ها ازtf.GradientTape استفادهtf.GradientTape .
  3. برای اعمال به روزرسانی وزن بر متغیرهای مدل ، از یکی از tf.keras.optimizers استفاده کنید.

یاد آوردن:

  • همیشه شامل training بحث خود در call روش از لایه های subclassed و مدل.
  • اطمینان حاصل کنید که این مدل با پاسخ training مجموعه استدلال درستی.
  • بسته به نوع استفاده ، متغیرهای مدل ممکن است وجود نداشته باشند تا زمانی که مدل روی دسته ای از داده ها اجرا شود.
  • شما باید به صورت دستی مواردی مانند ضررهای قاعده آور را برای مدل کنترل کنید.

به ساده سازی های مربوط به v1 توجه کنید:

  • دیگر نیازی به اجرای مقادیر اولیه نیست. متغیرها از زمان ایجاد اولیه می شوند.
  • نیازی به افزودن وابستگی های کنترل دستی نیست. حتی در عملکردهای 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 s کار می کنند.

یک شی loss ضرر قابل فراخوانی است و از (y_true ، y_pred) به عنوان آرگومان انتظار می رود:

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

یک شی متریک دارای روش های زیر است:

خود شی object قابل تماس است. فراخوانی حالت با مشاهدات جدید ، مانند 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"] عبور 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.SGD ، optimizers.Adam optimizers.RMSprop . optimizers.RMSprop یا optimizers.RMSprop . optimizers.RMSprop .

نرخ یادگیری پیش فرض زیر تغییر کرده است:

TensorBoard

TensorFlow 2.x شامل تغییرات قابل توجهی در tf.summary API است که برای نوشتن داده های خلاصه برای تجسم در TensorBoard استفاده می شود. برای معرفی کلی tf.summary جدید ، چندین آموزش در دسترس وجود دارد که از API TensorFlow 2.x استفاده می کنند. این شامل راهنمای مهاجرت TensorBoard TensorFlow 2.x است .

ذخیره و بارگیری

سازگاری با ایست بازرسی

TensorFlow 2.x از ایست های بازرسی مبتنی بر شی استفاده می کند .

اگر مراقب باشید ، ایستگاه های بازرسی مبتنی بر نام هنوز هم بارگیری می شوند. روند تبدیل کد ممکن است منجر به تغییر نام متغیر شود ، اما راه حل هایی وجود دارد.

برای ردیف کردن نام های مدل جدید با نام های موجود در ایست بازرسی ، ساده ترین روش را به آن نزدیک می کنید:

  • متغیرها هنوز هم همه دارای یک استدلال name که می توانید تنظیم کنید.
  • مدلهای Keras همچنین دارای یک استدلال name که آنها را به عنوان پیشوند متغیرهای خود تنظیم می کنند.
  • از تابع v1.name_scope می توان برای تنظیم پیشوندهای نام متغیر استفاده کرد. این تفاوت زیادی با tf.variable_scope . این فقط نام ها را تحت تأثیر قرار می دهد و متغیرها را ردیابی نمی کند و از آنها استفاده مجدد نمی کند.

اگر برای مورد استفاده شما مفید نیست ، عملکرد v1.train.init_from_checkpoint را امتحان کنید. این یک آرگومان assignment_map طول می کشد ، که نقشه برداری از نام های قدیمی به نام های جدید را مشخص می کند.

مخزن برآورد کننده TensorFlow شامل یک ابزار تبدیل برای ارتقاpo ایست های بازرسی برآوردگرهای از پیش تعیین شده از TensorFlow 1.x به 2.0 است. این ممکن است به عنوان نمونه ای از نحوه ساختن ابزاری برای موارد استفاده مشابه باشد.

سازگاری مدل های ذخیره شده

هیچ نگرانی سازگاری قابل توجهی برای مدلهای ذخیره شده وجود ندارد.

  • TensorFlow 1.x ذخیره شده_مدل ها در TensorFlow 2.x کار می کنند.
  • TensorFlow 2.x ذخیره شده_مدل ها در TensorFlow 1.x کار می کنند اگر همه گزینه ها پشتیبانی شوند.

یک Graph.pb یا Graph.pbtxt

هیچ راهی ساده برای ارتقا یک پرونده Graph.pb خام به Graph.pb 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 از tf.estimator.EvalSpec 1.x استفاده کنید.

در اینجا مثالی با استفاده از input_fn همراه با train و ارزیابی مشخصات وجود دارد.

ایجاد مشخصات input_fn و آموزش / ارزیابی

# 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 سفارشی خود را در model_fn 2.x کار کنید ، اگر حداقل تغییر در کد موجود را ترجیح می دهید ، می tf.compat.v1 نمادهای tf.compat.v1 مانند optimizers tf.compat.v1 و metrics استفاده کنید.

استفاده از مدل Keras در یک model_fn سفارشی مشابه استفاده از آن در یک حلقه آموزش سفارشی است:

  • بر اساس استدلال mode ، مرحله training طور مناسب تنظیم کنید.
  • trainable_variables مدل را به طور صریح به بهینه ساز منتقل کنید.

اما تفاوت های مهمی نسبت به یک حلقه سفارشی وجود دارد :

  • به جای استفاده از Model.losses ، تلفات را با استفاده از Model.get_losses_for .
  • با استفاده از Model.get_updates_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 2.x

اگر می خواهید از تمام نمادهای model_fn 1.x خلاص شوید و model_fn سفارشی خود را به model_fn 2.x ارتقا دهید ، باید بهینه ساز و معیارها را به tf.keras.optimizers و tf.keras.metrics .

در model_fn سفارشی ، علاوه بر تغییرات فوق ، باید model_fn نیز انجام شود:

برای مثال فوق 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}, [])

برآوردگرهای پیش ساخته

برآوردگرهای Premade در خانواده tf.estimator.DNN* ، tf.estimator.Linear* و tf.estimator.DNNLinearCombined* هنوز در API TensorFlow 2.x پشتیبانی می شوند. با این حال ، برخی از استدلال ها تغییر کرده اند:

  1. input_layer_partitioner : در v2 حذف شد.
  2. loss_reduction : به جای tf.keras.losses.Reduction به tf.keras.losses.Reduction به tf.compat.v1.losses.Reduction . مقدار پیش فرض آن نیز از tf.keras.losses.Reduction.SUM_OVER_BATCH_SIZE به 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 .

مبدل Checkpoint

مهاجرت به keras.optimizers نقاط بازرسی ذخیره شده با استفاده از TensorFlow 1.x را می tf.keras.optimizers ، زیرا 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

TensorShape

این کلاس برای نگه داشتن int به جای اشیا tf.compat.v1.Dimension شده است. بنابراین برای گرفتن int نیازی به فراخوانی .value نیست.

tf.compat.v1.Dimension فردی اشیا 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 : الگوریتم های قرارگیری دستگاه tf.colocate_with طور قابل توجهی بهبود یافته اند. این دیگر لازم نیست. اگر حذف آن باعث کاهش عملکرد می شود ، لطفاً یک اشکال وارد کنید .

  • استفاده از v1.ConfigProto با توابع معادل tf.config .

نتیجه گیری

روند کلی این است:

  1. اسکریپت ارتقا را اجرا کنید.
  2. نمادهای مشارکت را حذف کنید.
  3. مدلهای خود را به سبک شی گرا تغییر دهید (Keras).
  4. استفاده از tf.keras یا tf.estimator آموزش ها و حلقه ها بررسی که در آن شما می توانید.
  5. در غیر این صورت ، از حلقه های سفارشی استفاده کنید ، اما حتماً از جلسات و مجموعه ها خودداری کنید.

برای تبدیل کد به اصطلاح TensorFlow 2.x کمی کار طول می کشد ، اما هر تغییری منجر به موارد زیر می شود:

  • خط کد کمتری دارد.
  • افزایش وضوح و سادگی.
  • اشکال زدایی راحت تر