![]() | ![]() | ![]() | ![]() |
این راهنما برای کاربران 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 '
پس از تبدیل
- دسته ساده لایه ها به طور دقیق در
tf.keras.Sequential
. (برای مدلهای پیچیده تر ، لایه ها و مدلهای سفارشی و راهنماهای کاربردی API را بررسی کنید.) - این مدل متغیرها و ضررهای منظم سازی را ردیابی می کند.
- تبدیل یک به یک بود زیرا از
v1.layers
بهtf.keras.layers
یک نقشه برداری مستقیم وجود دارد.
بیشتر بحث ها ثابت مانده است. اما به تفاوت ها توجه کنید:
- استدلال
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
توصیه می شود. این روش ها یک رابط یکنواخت برای آموزش مدل بدون توجه به اجرا (ترتیبی ، عملکردی یا طبقه بندی فرعی) فراهم می کنند.
از مزایای این روشها می توان به موارد زیر اشاره کرد:
- آنها آرایه های Numpy ، مولدهای پایتون و
tf.data.Datasets
. - آنها به طور خودکار تنظیمات و تلفات فعال سازی را اعمال می کنند.
- آنها از
tf.distribute
برای آموزش چند دستگاه پشتیبانی می کنند . - آنها از درخواست های دلخواه به عنوان ضرر و معیار پشتیبانی می کنند.
- آنها از تماس هایی مانند
tf.keras.callbacks.TensorBoard
وtf.keras.callbacks.TensorBoard
سفارشی پشتیبانی می کنند. - آنها عملکردی دارند و به طور خودکار از نمودارهای TensorFlow استفاده می کنند.
در اینجا مثالی از آموزش مدل با استفاده از Dataset
. (برای جزئیات بیشتر در مورد نحوه کار ، به قسمت آموزش ها مراجعه کنید .)
model = tf.keras.Sequential([
tf.keras.layers.Conv2D(32, 3, activation='relu',
kernel_regularizer=tf.keras.regularizers.l2(0.02),
input_shape=(28, 28, 1)),
tf.keras.layers.MaxPooling2D(),
tf.keras.layers.Flatten(),
tf.keras.layers.Dropout(0.1),
tf.keras.layers.Dense(64, activation='relu'),
tf.keras.layers.BatchNormalization(),
tf.keras.layers.Dense(10)
])
# Model is the full model w/o custom layers
model.compile(optimizer='adam',
loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
metrics=['accuracy'])
model.fit(train_data, epochs=NUM_EPOCHS)
loss, acc = model.evaluate(test_data)
print("Loss {}, Accuracy {}".format(loss, acc))
Epoch 1/5 5/5 [==============================] - 1s 9ms/step - loss: 2.0191 - accuracy: 0.3608 Epoch 2/5 5/5 [==============================] - 0s 9ms/step - loss: 0.4736 - accuracy: 0.9059 Epoch 3/5 5/5 [==============================] - 0s 8ms/step - loss: 0.2973 - accuracy: 0.9626 Epoch 4/5 5/5 [==============================] - 0s 9ms/step - loss: 0.2108 - accuracy: 0.9911 Epoch 5/5 5/5 [==============================] - 0s 8ms/step - loss: 0.1791 - accuracy: 0.9874 5/5 [==============================] - 0s 6ms/step - loss: 1.5504 - accuracy: 0.7500 Loss 1.5504140853881836, Accuracy 0.75
حلقه خود را بنویسید
اگر مرحله آموزش مدل Keras برای شما مناسب است ، اما شما به کنترل بیشتری در خارج از مرحله نیاز دارید ، استفاده از روش tf.keras.Model.train_on_batch
، در حلقه تکرار داده خود.
به یاد داشته باشید: بسیاری از موارد را می توان به صورت tf.keras.callbacks.Callback
پیاده سازی tf.keras.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
مرحله آموزش را سفارشی کنید
اگر به انعطاف پذیری و کنترل بیشتری نیاز دارید ، می توانید با اجرای حلقه آموزش خود ، آن را داشته باشید. سه مرحله وجود دارد:
- برای به دست آوردن دسته ای از مثالها ، از یک مولد پایتون یا
tf.data.Dataset
کنید. - برای جمع كردن شیب ها از
tf.GradientTape
استفادهtf.GradientTape
. - برای اعمال به روزرسانی وزن بر متغیرهای مدل ، از یکی از
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
یک شی متریک دارای روش های زیر است:
-
Metric.update_state()
: مشاهدات جدید اضافه کنید. -
Metric.result()
: با توجه به مقادیر مشاهده شده ، نتیجه کنونی متریک را بدست آورید. -
Metric.reset_states()
: همه مشاهدات را پاک کنید.
خود شی 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
در اینجا مواردی وجود دارد که باید هنگام تبدیل بهینه سازها به خاطر داشته باشید:
- به روزرسانی بهینه سازها ممکن است ایست های بازرسی قدیمی را ناسازگار کند .
- اکنون همه اپسیلون ها به جای
1e-8
به1e-7
پیش فرض می شوند (که در اکثر موارد استفاده ناچیز است). -
v1.train.GradientDescentOptimizer
می تواند به طور مستقیم باtf.keras.optimizers.SGD
جایگزین شود. -
v1.train.MomentumOptimizer
می توان مستقیماً با بهینه سازSGD
با استفاده از استدلال مومنتومtf.keras.optimizers.SGD(..., momentum=...)
:tf.keras.optimizers.SGD(..., momentum=...)
. -
v1.train.AdamOptimizer
می تواند به استفاده ازtf.keras.optimizers.Adam
تبدیل شود. آرگومانهایbeta1
وbeta2
بهbeta_1
وbeta_2
تغییر نام داده اند. -
v1.train.RMSPropOptimizer
می توان بهtf.keras.optimizers.RMSprop
تبدیل کرد. استدلالdecay
بهrho
تغییر نام داده است. -
v1.train.AdadeltaOptimizer
می تواند مستقیماً بهtf.keras.optimizers.Adadelta
تبدیل شود. -
tf.train.AdagradOptimizer
می توان مستقیماً بهtf.keras.optimizers.Adagrad
. -
tf.train.FtrlOptimizer
می توان مستقیماً بهtf.keras.optimizers.Ftrl
.accum_name
وlinear_name
حذف شده اند. -
tf.contrib.AdamaxOptimizer
وtf.contrib.NadamOptimizer
می توانند بهtf.keras.optimizers.Adamax
مستقیماً بهtf.keras.optimizers.Adamax
وtf.keras.optimizers.Nadam
شوند. آرگومانهایbeta1
وbeta2
بهbeta_1
وbeta_2
تغییر نام داده اند.
پیش فرض های جدید برای برخی از tf.keras.optimizers
هیچ تغییری برای optimizers.SGD
وجود ندارد. optimizers.SGD
، optimizers.Adam
optimizers.RMSprop
. optimizers.RMSprop
یا optimizers.RMSprop
. optimizers.RMSprop
.
نرخ یادگیری پیش فرض زیر تغییر کرده است:
-
optimizers.Adagrad
از 0.01 تا 0.001 -
optimizers.Adadelta
از 1.0 تا 0.001 -
optimizers.Adamax
سازها. Adamax از 0.002 تا 0.001 -
optimizers.Nadam
سازها. ندام از 0.002 تا 0.001
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
نیز انجام شود:
- استفاده از
tf.keras.optimizers
جایv1.train.Optimizer
. -
tf.keras.optimizers
trainable_variables
مدل را بهtf.keras.optimizers
بهtf.keras.optimizers
. - برای محاسبه
train_op/minimize_op
،- اگر از دست دادن
Tensor
از دست دادن مقیاس است (قابل جبران نیست) ازOptimizer.get_updates
استفاده کنید. اولین عنصر در لیست برگشتtrain_op/minimize_op
مورد نظر است. - اگر ضرر قابل استناد است (مانند عملکرد) ، از
Optimizer.minimize
برای دریافتtrain_op/minimize_op
.
- اگر از دست دادن
- استفاده از
tf.keras.metrics
جایtf.compat.v1.metrics
برای ارزیابی است.
برای مثال فوق my_model_fn
، کد انتقال یافته با نمادهای TensorFlow 2.x به صورت زیر نشان داده شده است:
def my_model_fn(features, labels, mode):
model = make_model()
training = (mode == tf.estimator.ModeKeys.TRAIN)
loss_obj = tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True)
predictions = model(features, training=training)
# Get both the unconditional losses (the None part)
# and the input-conditional losses (the features part).
reg_losses = model.get_losses_for(None) + model.get_losses_for(features)
total_loss=loss_obj(labels, predictions) + tf.math.add_n(reg_losses)
# Upgrade to tf.keras.metrics.
accuracy_obj = tf.keras.metrics.Accuracy(name='acc_obj')
accuracy = accuracy_obj.update_state(
y_true=labels, y_pred=tf.math.argmax(predictions, axis=1))
train_op = None
if training:
# Upgrade to tf.keras.optimizers.
optimizer = tf.keras.optimizers.Adam()
# Manually assign tf.compat.v1.global_step variable to optimizer.iterations
# to make tf.compat.v1.train.global_step increased correctly.
# This assignment is a must for any `tf.train.SessionRunHook` specified in
# estimator, as SessionRunHooks rely on global step.
optimizer.iterations = tf.compat.v1.train.get_or_create_global_step()
# Get both the unconditional updates (the None part)
# and the input-conditional updates (the features part).
update_ops = model.get_updates_for(None) + model.get_updates_for(features)
# Compute the minimize_op.
minimize_op = optimizer.get_updates(
total_loss,
model.trainable_variables)[0]
train_op = tf.group(minimize_op, *update_ops)
return tf.estimator.EstimatorSpec(
mode=mode,
predictions=predictions,
loss=total_loss,
train_op=train_op,
eval_metric_ops={'Accuracy': accuracy_obj})
# Create the Estimator and train.
estimator = tf.estimator.Estimator(model_fn=my_model_fn)
tf.estimator.train_and_evaluate(estimator, train_spec, eval_spec)
INFO:tensorflow:Using default config. INFO:tensorflow:Using default config. WARNING:tensorflow:Using temporary folder as model directory: /tmp/tmpc93qfnv6 WARNING:tensorflow:Using temporary folder as model directory: /tmp/tmpc93qfnv6 INFO:tensorflow:Using config: {'_model_dir': '/tmp/tmpc93qfnv6', '_tf_random_seed': None, '_save_summary_steps': 100, '_save_checkpoints_steps': None, '_save_checkpoints_secs': 600, '_session_config': allow_soft_placement: true graph_options { rewrite_options { meta_optimizer_iterations: ONE } } , '_keep_checkpoint_max': 5, '_keep_checkpoint_every_n_hours': 10000, '_log_step_count_steps': 100, '_train_distribute': None, '_device_fn': None, '_protocol': None, '_eval_distribute': None, '_experimental_distribute': None, '_experimental_max_worker_delay_secs': None, '_session_creation_timeout_secs': 7200, '_checkpoint_save_graph_def': True, '_service': None, '_cluster_spec': ClusterSpec({}), '_task_type': 'worker', '_task_id': 0, '_global_id_in_cluster': 0, '_master': '', '_evaluation_master': '', '_is_chief': True, '_num_ps_replicas': 0, '_num_worker_replicas': 1} INFO:tensorflow:Using config: {'_model_dir': '/tmp/tmpc93qfnv6', '_tf_random_seed': None, '_save_summary_steps': 100, '_save_checkpoints_steps': None, '_save_checkpoints_secs': 600, '_session_config': allow_soft_placement: true graph_options { rewrite_options { meta_optimizer_iterations: ONE } } , '_keep_checkpoint_max': 5, '_keep_checkpoint_every_n_hours': 10000, '_log_step_count_steps': 100, '_train_distribute': None, '_device_fn': None, '_protocol': None, '_eval_distribute': None, '_experimental_distribute': None, '_experimental_max_worker_delay_secs': None, '_session_creation_timeout_secs': 7200, '_checkpoint_save_graph_def': True, '_service': None, '_cluster_spec': ClusterSpec({}), '_task_type': 'worker', '_task_id': 0, '_global_id_in_cluster': 0, '_master': '', '_evaluation_master': '', '_is_chief': True, '_num_ps_replicas': 0, '_num_worker_replicas': 1} INFO:tensorflow:Not using Distribute Coordinator. INFO:tensorflow:Not using Distribute Coordinator. INFO:tensorflow:Running training and evaluation locally (non-distributed). INFO:tensorflow:Running training and evaluation locally (non-distributed). INFO:tensorflow:Start train and evaluate loop. The evaluate will happen after every checkpoint. Checkpoint frequency is determined based on RunConfig arguments: save_checkpoints_steps None or save_checkpoints_secs 600. INFO:tensorflow:Start train and evaluate loop. The evaluate will happen after every checkpoint. Checkpoint frequency is determined based on RunConfig arguments: save_checkpoints_steps None or save_checkpoints_secs 600. INFO:tensorflow:Calling model_fn. INFO:tensorflow:Calling model_fn. INFO:tensorflow:Done calling model_fn. INFO:tensorflow:Done calling model_fn. INFO:tensorflow:Create CheckpointSaverHook. INFO:tensorflow:Create CheckpointSaverHook. INFO:tensorflow:Graph was finalized. INFO:tensorflow:Graph was finalized. INFO:tensorflow:Running local_init_op. INFO:tensorflow:Running local_init_op. INFO:tensorflow:Done running local_init_op. INFO:tensorflow:Done running local_init_op. INFO:tensorflow:Calling checkpoint listeners before saving checkpoint 0... INFO:tensorflow:Calling checkpoint listeners before saving checkpoint 0... INFO:tensorflow:Saving checkpoints for 0 into /tmp/tmpc93qfnv6/model.ckpt. INFO:tensorflow:Saving checkpoints for 0 into /tmp/tmpc93qfnv6/model.ckpt. INFO:tensorflow:Calling checkpoint listeners after saving checkpoint 0... INFO:tensorflow:Calling checkpoint listeners after saving checkpoint 0... INFO:tensorflow:loss = 2.5293791, step = 0 INFO:tensorflow:loss = 2.5293791, step = 0 INFO:tensorflow:Calling checkpoint listeners before saving checkpoint 25... INFO:tensorflow:Calling checkpoint listeners before saving checkpoint 25... INFO:tensorflow:Saving checkpoints for 25 into /tmp/tmpc93qfnv6/model.ckpt. INFO:tensorflow:Saving checkpoints for 25 into /tmp/tmpc93qfnv6/model.ckpt. INFO:tensorflow:Calling checkpoint listeners after saving checkpoint 25... INFO:tensorflow:Calling checkpoint listeners after saving checkpoint 25... INFO:tensorflow:Calling model_fn. INFO:tensorflow:Calling model_fn. INFO:tensorflow:Done calling model_fn. INFO:tensorflow:Done calling model_fn. INFO:tensorflow:Starting evaluation at 2021-01-06T02:31:24Z INFO:tensorflow:Starting evaluation at 2021-01-06T02:31:24Z INFO:tensorflow:Graph was finalized. INFO:tensorflow:Graph was finalized. INFO:tensorflow:Restoring parameters from /tmp/tmpc93qfnv6/model.ckpt-25 INFO:tensorflow:Restoring parameters from /tmp/tmpc93qfnv6/model.ckpt-25 INFO:tensorflow:Running local_init_op. INFO:tensorflow:Running local_init_op. INFO:tensorflow:Done running local_init_op. INFO:tensorflow:Done running local_init_op. INFO:tensorflow:Evaluation [1/5] INFO:tensorflow:Evaluation [1/5] INFO:tensorflow:Evaluation [2/5] INFO:tensorflow:Evaluation [2/5] INFO:tensorflow:Evaluation [3/5] INFO:tensorflow:Evaluation [3/5] INFO:tensorflow:Evaluation [4/5] INFO:tensorflow:Evaluation [4/5] INFO:tensorflow:Evaluation [5/5] INFO:tensorflow:Evaluation [5/5] INFO:tensorflow:Inference Time : 0.86534s INFO:tensorflow:Inference Time : 0.86534s INFO:tensorflow:Finished evaluation at 2021-01-06-02:31:25 INFO:tensorflow:Finished evaluation at 2021-01-06-02:31:25 INFO:tensorflow:Saving dict for global step 25: Accuracy = 0.59375, global_step = 25, loss = 1.7570661 INFO:tensorflow:Saving dict for global step 25: Accuracy = 0.59375, global_step = 25, loss = 1.7570661 INFO:tensorflow:Saving 'checkpoint_path' summary for global step 25: /tmp/tmpc93qfnv6/model.ckpt-25 INFO:tensorflow:Saving 'checkpoint_path' summary for global step 25: /tmp/tmpc93qfnv6/model.ckpt-25 INFO:tensorflow:Loss for final step: 0.47094986. INFO:tensorflow:Loss for final step: 0.47094986. ({'Accuracy': 0.59375, 'loss': 1.7570661, 'global_step': 25}, [])
برآوردگرهای پیش ساخته
برآوردگرهای Premade در خانواده tf.estimator.DNN*
، tf.estimator.Linear*
و tf.estimator.DNNLinearCombined*
هنوز در API TensorFlow 2.x پشتیبانی می شوند. با این حال ، برخی از استدلال ها تغییر کرده اند:
-
input_layer_partitioner
: در v2 حذف شد. -
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
. -
optimizer
،dnn_optimizer
وlinear_optimizer
: این استدلال شده است به روز شدهtf.keras.optimizers
به جایtf.compat.v1.train.Optimizer
.
برای انتقال تغییرات فوق:
- برای
input_layer_partitioner
نیازی به مهاجرت نیست زیراDistribution Strategy
آن را به صورت خودکار در TensorFlow 2.x کنترل می کند. - برای
loss_reduction
،tf.keras.losses.Reduction
برای گزینه های پشتیبانی شده بررسی کنید. - برای بحث های
optimizer
:- اگر این کار را انجام ندهید: 1) آرگومان
optimizer
،dnn_optimizer
یاlinear_optimizer
را وارد کنید یا 2) آرگومانoptimizer
را به عنوانstring
در کد خود مشخص کنید ، دیگر نیازی به تغییر چیزی ندارید زیراtf.keras.optimizers
به طور پیش فرض استفاده می شود . - در غیر این صورت ، باید آن را از
tf.compat.v1.train.Optimizer
بهtf.keras.optimizers
مربوطه بهtf.keras.optimizers
.
- اگر این کار را انجام ندهید: 1) آرگومان
مبدل 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
.
نتیجه گیری
روند کلی این است:
- اسکریپت ارتقا را اجرا کنید.
- نمادهای مشارکت را حذف کنید.
- مدلهای خود را به سبک شی گرا تغییر دهید (Keras).
- استفاده از
tf.keras
یاtf.estimator
آموزش ها و حلقه ها بررسی که در آن شما می توانید. - در غیر این صورت ، از حلقه های سفارشی استفاده کنید ، اما حتماً از جلسات و مجموعه ها خودداری کنید.
برای تبدیل کد به اصطلاح TensorFlow 2.x کمی کار طول می کشد ، اما هر تغییری منجر به موارد زیر می شود:
- خط کد کمتری دارد.
- افزایش وضوح و سادگی.
- اشکال زدایی راحت تر