این صفحه به‌وسیله ‏Cloud Translation API‏ ترجمه شده است.
Switch to English

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

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

این سند برای کاربران سطح پایین API های TensorFlow. اگر از API های سطح بالا ( 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 استفاده کند.

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

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

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

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

    • این ممکن است رفتار را در موارد لبه تغییر دهد.
    • این ممکن است نسخه های اضافی ایجاد کند و می تواند از حافظه بیشتری استفاده کند.
    • این را می توان با استفاده از use_resource=False به سازنده tf.Variable .
  • اشکال تنسور ، 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 را مرور می کند. این تغییرات باعث می شود که کد شما از بهینه سازی عملکرد و تماس های API ساده استفاده کند.

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

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

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

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

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

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

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

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

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

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

تمام ردیابی متغیرهای مبتنی بر نام در TF 2.0 به شدت ناامید می شوند. برای ردیابی متغیرها از اشیا 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 TF2 در صورت ایمن بودن چنین تبدیل ، نمادها را به معادل 2.0 تبدیل می کند ، یعنی اگر بتواند تعیین کند که رفتار نسخه 2.0 دقیقاً برابر است (به عنوان مثال ، نام v1.arg_max به v1.arg_max تغییر می tf.argmax ، از آنجا که آنها همان عملکرد هستند).

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

تبدیل مدل ها

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

نمونه هایی از استفاده از سطح پایین 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)
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.25911403  0.04995662 -0.29216325 -0.2735252  -0.3113699  -0.00610226
  -0.00793289 -0.02005042 -0.22002988 -0.11050846]], shape=(1, 10), dtype=float32)

پس از تبدیل

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

  • استدلال training هنگام اجرا به هر لایه توسط مدل منتقل می شود.
  • اولین آرگومان مربوط به تابع model اصلی (ورودی x ) از بین رفته است. این به این دلیل است که لایه های جسم ساختمان را از فراخوانی مدل جدا می کنند.

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

  • اگر از تنظیم کننده های تنظیم کننده های اولیه 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.04179893 -0.07949039 -0.21679714  0.11532308  0.15619203 -0.0883522
   0.12719868 -0.0547747  -0.03558816  0.02265415]], 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.083086945>]

متغیرهای مخلوط و v1.layers

کد موجود اغلب متغیرها و عملکردهای سطح پایین تر TF 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 & contrib.layers

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

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

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

آموزش

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

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

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

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

بسته tfds Datasets ( tfds ) شامل برنامه های tfds برای بارگذاری مجموعه های داده از پیش تعریف شده به عنوان اشیا tf.data.Dataset است.

برای این مثال ، MNISTdataset را با استفاده از tfds :

datasets, info = tfds.load(name='mnist', with_info=True, as_supervised=True)
mnist_train, mnist_test = datasets['train'], datasets['test']
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`.


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...
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 [==============================] - 0s 6ms/step - loss: 1.4729 - accuracy: 0.5437
Epoch 2/5
5/5 [==============================] - 0s 6ms/step - loss: 0.4612 - accuracy: 0.9125
Epoch 3/5
5/5 [==============================] - 0s 6ms/step - loss: 0.3007 - accuracy: 0.9594
Epoch 4/5
5/5 [==============================] - 0s 6ms/step - loss: 0.2222 - accuracy: 0.9875
Epoch 5/5
5/5 [==============================] - 0s 6ms/step - loss: 0.1858 - accuracy: 0.9875
5/5 [==============================] - 0s 4ms/step - loss: 1.5550 - accuracy: 0.5594
Loss 1.5550143718719482, Accuracy 0.559374988079071

حلقه خود را بنویسید

اگر مرحله آموزش مدل 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.151 accuracy: 1.000
train:  loss: 0.212 accuracy: 0.953
train:  loss: 0.186 accuracy: 0.969
train:  loss: 0.217 accuracy: 0.969
train:  loss: 0.201 accuracy: 0.984

eval:  loss: 1.567 accuracy: 0.597
train:  loss: 0.109 accuracy: 1.000
train:  loss: 0.098 accuracy: 1.000
train:  loss: 0.104 accuracy: 1.000
train:  loss: 0.131 accuracy: 0.984
train:  loss: 0.113 accuracy: 0.984

eval:  loss: 1.545 accuracy: 0.625
train:  loss: 0.076 accuracy: 1.000
train:  loss: 0.087 accuracy: 1.000
train:  loss: 0.081 accuracy: 1.000
train:  loss: 0.081 accuracy: 1.000
train:  loss: 0.077 accuracy: 1.000

eval:  loss: 1.509 accuracy: 0.731
train:  loss: 0.059 accuracy: 1.000
train:  loss: 0.065 accuracy: 1.000
train:  loss: 0.062 accuracy: 1.000
train:  loss: 0.061 accuracy: 1.000
train:  loss: 0.056 accuracy: 1.000

eval:  loss: 1.485 accuracy: 0.781
train:  loss: 0.055 accuracy: 1.000
train:  loss: 0.051 accuracy: 1.000
train:  loss: 0.052 accuracy: 1.000
train:  loss: 0.050 accuracy: 1.000
train:  loss: 0.055 accuracy: 1.000

eval:  loss: 1.464 accuracy: 0.803

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

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

  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.0 ، معیارها و ضررها اشیا هستند. اینها هم با اشتیاق و هم در 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.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.177
  accuracy: 0.981
Epoch:  1
  loss:     0.150
  accuracy: 0.988
Epoch:  2
  loss:     0.134
  accuracy: 0.997
Epoch:  3
  loss:     0.116
  accuracy: 1.000
Epoch:  4
  loss:     0.097
  accuracy: 1.000

نام های متریک Keras

در TensorFlow 2.0 مدلهای 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 [==============================] - 0s 6ms/step - loss: 0.1139 - acc: 0.9937 - accuracy: 0.9937 - my_accuracy: 0.9937

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.Adam ، یا optimizers.RMSprop . 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 شامل یک ابزار تبدیل برای ارتقاpo ایست های بازرسی برآوردگرهای از پیش تعیین شده از TensorFlow 1.X به 2.0 است. این ممکن است به عنوان نمونه ای از نحوه ساختن ابزاری برای موارد مشابه استفاده شود.

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

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

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

یک Graph.pb یا Graph.pbtxt

هیچ راهی ساده برای ارتقا پرونده Graph.pb خام به Graph.pb 2.0 وجود ندارد. بهترین شرط شما این است که کدی را که فایل را ایجاد کرده است به روز کنید.

اما، اگر شما یک "نمودار منجمد" (یک 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.0 پشتیبانی می شوند.

هنگام استفاده از برآوردگرها ، می توانید از 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 & 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/tmpgnqimrn9

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

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/tmpgnqimrn9', '_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/tmpgnqimrn9', '_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/tmpgnqimrn9/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/tmpgnqimrn9/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/tmpgnqimrn9/keras/keras_model.ckpt

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

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

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

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

INFO:tensorflow:loss = 2.5481484, step = 0

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

INFO:tensorflow:Saving checkpoints for 25 into /tmp/tmpgnqimrn9/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-09-19T01:25:32Z

INFO:tensorflow:Starting evaluation at 2020-09-19T01:25:32Z

INFO:tensorflow:Graph was finalized.

INFO:tensorflow:Graph was finalized.

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

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

INFO:tensorflow:Inference Time : 0.86522s

INFO:tensorflow:Finished evaluation at 2020-09-19-01:25:33

INFO:tensorflow:Finished evaluation at 2020-09-19-01:25:33

INFO:tensorflow:Saving dict for global step 25: accuracy = 0.553125, global_step = 25, loss = 1.6822916

INFO:tensorflow:Saving dict for global step 25: accuracy = 0.553125, global_step = 25, loss = 1.6822916

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

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

INFO:tensorflow:Loss for final step: 0.46296218.

INFO:tensorflow:Loss for final step: 0.46296218.

({'accuracy': 0.553125, 'loss': 1.6822916, '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 سفارشی مشابه استفاده از آن در یک حلقه آموزش سفارشی است:

  • بر اساس استدلال 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/tmpdqm3gv9f

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

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

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

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

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

INFO:tensorflow:loss = 2.6994424, step = 0

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

INFO:tensorflow:Saving checkpoints for 25 into /tmp/tmpdqm3gv9f/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-09-19T01:25:36Z

INFO:tensorflow:Starting evaluation at 2020-09-19T01:25:36Z

INFO:tensorflow:Graph was finalized.

INFO:tensorflow:Graph was finalized.

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

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

INFO:tensorflow:Inference Time : 0.91620s

INFO:tensorflow:Finished evaluation at 2020-09-19-01:25:36

INFO:tensorflow:Finished evaluation at 2020-09-19-01:25:36

INFO:tensorflow:Saving dict for global step 25: accuracy = 0.6, global_step = 25, loss = 1.5189537

INFO:tensorflow:Saving dict for global step 25: accuracy = 0.6, global_step = 25, loss = 1.5189537

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

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

INFO:tensorflow:Loss for final step: 0.5045532.

INFO:tensorflow:Loss for final step: 0.5045532.

({'accuracy': 0.6, 'loss': 1.5189537, 'global_step': 25}, [])

model_fn سفارشی با نمادهای TF 2.0

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

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

برای مثال فوق my_model_fn ، کد انتقال یافته با 2.0 نماد به صورت زیر نشان داده شده است:

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 & 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/tmp_y4k0o_v

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

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

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

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

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

INFO:tensorflow:loss = 2.7534888, step = 0

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

INFO:tensorflow:Saving checkpoints for 25 into /tmp/tmp_y4k0o_v/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-09-19T01:25:39Z

INFO:tensorflow:Starting evaluation at 2020-09-19T01:25:39Z

INFO:tensorflow:Graph was finalized.

INFO:tensorflow:Graph was finalized.

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

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

INFO:tensorflow:Inference Time : 0.85182s

INFO:tensorflow:Finished evaluation at 2020-09-19-01:25:40

INFO:tensorflow:Finished evaluation at 2020-09-19-01:25:40

INFO:tensorflow:Saving dict for global step 25: Accuracy = 0.740625, global_step = 25, loss = 1.6748577

INFO:tensorflow:Saving dict for global step 25: Accuracy = 0.740625, global_step = 25, loss = 1.6748577

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

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

INFO:tensorflow:Loss for final step: 0.3578726.

INFO:tensorflow:Loss for final step: 0.3578726.

({'Accuracy': 0.740625, 'loss': 1.6748577, '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.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 به طور خودکار آن را در TF 2.0 کنترل می کند.
  2. برای loss_reduction ، tf.keras.losses.Reduction برای گزینه های پشتیبانی شده بررسی کنید.
  3. برای args optimizer ، اگر optimizer ، dnn_optimizer یا linear_optimizer arg وارد نمی شوید ، یا اگر arg optimizer به عنوان string در کد خود مشخص می کنید ، نیازی به تغییر چیزی ندارید. tf.keras.optimizers به طور پیش فرض استفاده می شود. در غیر این صورت ، شما باید آن را از tf.compat.v1.train.Optimizer به tf.keras.optimizers مربوطه به tf.keras.optimizers

مبدل Checkpoint

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

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

 python checkpoint_converter.py -h
2020-09-19 01:25:41.394385: 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

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.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

مقدار boolean یک 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.0 کمی کار طول می کشد ، اما هر تغییری منجر به موارد زیر می شود:

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