مشاهده در TensorFlow.org | در Google Colab اجرا شود | در GitHub مشاهده کنید | دانلود دفترچه یادداشت |
بررسی اجمالی
این راهنما فهرستی از بهترین روشها برای نوشتن کد با استفاده از TensorFlow 2 (TF2) ارائه میکند، که برای کاربرانی نوشته شده است که اخیراً از TensorFlow 1 (TF1) تغییر مکان دادهاند. برای اطلاعات بیشتر در مورد انتقال کد TF1 به TF2، به بخش مهاجرت در راهنما مراجعه کنید.
برپایی
TensorFlow و دیگر وابستگیها را برای مثالهای این راهنما وارد کنید.
import tensorflow as tf
import tensorflow_datasets as tfds
توصیه هایی برای اصطلاحی TensorFlow 2
کد خود را به ماژول های کوچکتر تبدیل کنید
یک تمرین خوب این است که کد خود را به توابع کوچکتر تبدیل کنید که در صورت لزوم فراخوانی می شوند. برای بهترین عملکرد، باید سعی کنید بزرگترین بلوکهای محاسباتی را که میتوانید در یک tf.function
کنید (توجه داشته باشید که توابع پایتون تودرتو که توسط یک tf.function
نامیده میشوند نیازی به تزئینات جداگانه خود ندارند، مگر اینکه بخواهید از jit_compile
متفاوت استفاده کنید. تنظیمات برای tf.function
). بسته به مورد استفاده شما، این می تواند چندین مرحله آموزشی یا حتی کل حلقه آموزشی شما باشد. برای موارد استفاده از استنباط، ممکن است یک مدل واحد به جلو باشد.
نرخ یادگیری پیش فرض را برای برخی از tf.keras.optimizer
کنید
برخی از بهینه سازهای Keras نرخ های یادگیری متفاوتی در TF2 دارند. اگر تغییری در رفتار همگرایی برای مدلهای خود مشاهده کردید، نرخهای یادگیری پیشفرض را بررسی کنید.
هیچ تغییری برای optimizers.SGD
، optimizers.Adam
، یا optimizers.RMSprop
وجود ندارد.
نرخهای یادگیری پیشفرض زیر تغییر کرده است:
-
optimizers.Adagrad
از0.01
تا0.001
-
optimizers.Adadelta
از1.0
تا0.001
-
optimizers.Adamax
از0.002
تا0.001
-
optimizers.Nadam
سازها.Nadam از0.002
تا0.001
برای مدیریت متغیرها از لایه های tf.Module
s و Keras استفاده کنید
tf.Module
s و tf.keras.layers.Layer
variables
مناسب و ویژگی های trainable_variables
را ارائه می دهند که به صورت بازگشتی همه متغیرهای وابسته را جمع آوری می کنند. این امر مدیریت متغیرها را به صورت محلی در محل مورد استفاده آسان می کند.
لایهها/مدلهای Keras از tf.train.Checkpointable
به ارث میبرند و با @tf.function
ادغام میشوند، که امکان بررسی مستقیم یا صادر کردن SavedModels از اشیاء Keras را فراهم میکند. برای استفاده از این ادغام ها لزوماً نیازی به استفاده از Keras' Model.fit
API ندارید.
برای یادگیری نحوه جمعآوری زیرمجموعهای از متغیرهای مرتبط با استفاده از Keras، بخش آموزش انتقال و تنظیم دقیق را در راهنمای Keras بخوانید.
tf.data.Dataset
s و tf.function
با هم ترکیب کنید
بسته TensorFlow Datasets ( tfds
) شامل ابزارهایی برای بارگیری مجموعه داده های از پیش تعریف شده به عنوان اشیاء tf.data.Dataset
است. برای این مثال، می توانید مجموعه داده MNIST را با استفاده از tfds
:
datasets, info = tfds.load(name='mnist', with_info=True, as_supervised=True)
mnist_train, mnist_test = datasets['train'], datasets['test']
سپس داده ها را برای آموزش آماده کنید:
- مقیاس هر تصویر را مجدداً تغییر دهید.
- ترتیب مثال ها را با هم مخلوط کنید.
- دسته ای از تصاویر و برچسب ها را جمع آوری کنید.
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))
2021-12-08 17:15:01.637157: W tensorflow/core/kernels/data/cache_dataset_ops.cc:768] The calling iterator did not fully read the dataset being cached. In order to avoid unexpected truncation of the dataset, the partially cached contents of the dataset will be discarded. This can happen if you have an input pipeline similar to `dataset.cache().take(k).repeat()`. You should use `dataset.take(k).cache().repeat()` instead.
از تکرار منظم پایتون برای تکرار روی داده های آموزشی که در حافظه جا می گیرند استفاده کنید. در غیر این صورت، tf.data.Dataset
بهترین راه برای استریم داده های آموزشی از دیسک است. مجموعه داده ها تکرار شونده هستند (نه تکرار شونده) و درست مانند سایر تکرارپذیرهای پایتون در اجرای مشتاقانه کار می کنند. میتوانید با قرار دادن کد خود در tf.function
، که با استفاده از AutoGraph، جایگزینی تکرار Python با عملیات گراف معادل با استفاده از AutoGraph میشود، از ویژگیهای پیش واکشی/جریانسازی async مجموعه داده به طور کامل استفاده کنید.
@tf.function
def train(model, dataset, optimizer):
for x, y in dataset:
with tf.GradientTape() as tape:
# training=True is only needed if there are layers with different
# behavior during training versus inference (e.g. Dropout).
prediction = model(x, training=True)
loss = loss_fn(prediction, y)
gradients = tape.gradient(loss, model.trainable_variables)
optimizer.apply_gradients(zip(gradients, model.trainable_variables))
اگر از Keras Model.fit
API استفاده می کنید، دیگر نگران تکرار مجموعه داده نخواهید بود.
model.compile(optimizer=optimizer, loss=loss_fn)
model.fit(dataset)
از حلقه های آموزشی Keras استفاده کنید
اگر نیازی به کنترل سطح پایین فرآیند تمرین خود ندارید، استفاده از روشهای fit
، evaluate
و predict
داخلی Keras توصیه میشود. این روشها یک رابط یکنواخت برای آموزش مدل بدون توجه به پیادهسازی (متوالی، عملکردی یا زیر کلاس) فراهم میکنند.
از مزایای این روش ها می توان به موارد زیر اشاره کرد:
- آنها آرایه های Numpy، مولدهای پایتون و
tf.data.Datasets
می پذیرند. - آنها منظم سازی، و ضررهای فعال سازی را به طور خودکار اعمال می کنند.
- آنها از
tf.distribute
پشتیبانی می کنند که در آن کد آموزشی بدون توجه به پیکربندی سخت افزار یکسان باقی می ماند. - آنها از تماس های دلخواه به عنوان ضرر و معیار پشتیبانی می کنند.
- آنها از تماسهای برگشتی مانند
tf.keras.callbacks.TensorBoard
و تماسهای سفارشی پشتیبانی میکنند. - آنها به طور خودکار از نمودارهای TensorFlow استفاده می کنند.
در اینجا نمونه ای از آموزش یک مدل با استفاده از Dataset
شده است. برای جزئیات بیشتر در مورد نحوه عملکرد، آموزش ها را بررسی کنید.
model = tf.keras.Sequential([
tf.keras.layers.Conv2D(32, 3, activation='relu',
kernel_regularizer=tf.keras.regularizers.l2(0.02),
input_shape=(28, 28, 1)),
tf.keras.layers.MaxPooling2D(),
tf.keras.layers.Flatten(),
tf.keras.layers.Dropout(0.1),
tf.keras.layers.Dense(64, activation='relu'),
tf.keras.layers.BatchNormalization(),
tf.keras.layers.Dense(10)
])
# Model is the full model w/o custom layers
model.compile(optimizer='adam',
loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
metrics=['accuracy'])
model.fit(train_data, epochs=NUM_EPOCHS)
loss, acc = model.evaluate(test_data)
print("Loss {}, Accuracy {}".format(loss, acc))
Epoch 1/5 5/5 [==============================] - 9s 7ms/step - loss: 1.5762 - accuracy: 0.4938 Epoch 2/5 2021-12-08 17:15:11.145429: W tensorflow/core/kernels/data/cache_dataset_ops.cc:768] The calling iterator did not fully read the dataset being cached. In order to avoid unexpected truncation of the dataset, the partially cached contents of the dataset will be discarded. This can happen if you have an input pipeline similar to `dataset.cache().take(k).repeat()`. You should use `dataset.take(k).cache().repeat()` instead. 5/5 [==============================] - 0s 6ms/step - loss: 0.5087 - accuracy: 0.8969 Epoch 3/5 2021-12-08 17:15:11.559374: W tensorflow/core/kernels/data/cache_dataset_ops.cc:768] The calling iterator did not fully read the dataset being cached. In order to avoid unexpected truncation of the dataset, the partially cached contents of the dataset will be discarded. This can happen if you have an input pipeline similar to `dataset.cache().take(k).repeat()`. You should use `dataset.take(k).cache().repeat()` instead. 5/5 [==============================] - 2s 5ms/step - loss: 0.3348 - accuracy: 0.9469 Epoch 4/5 2021-12-08 17:15:13.860407: W tensorflow/core/kernels/data/cache_dataset_ops.cc:768] The calling iterator did not fully read the dataset being cached. In order to avoid unexpected truncation of the dataset, the partially cached contents of the dataset will be discarded. This can happen if you have an input pipeline similar to `dataset.cache().take(k).repeat()`. You should use `dataset.take(k).cache().repeat()` instead. 5/5 [==============================] - 0s 5ms/step - loss: 0.2445 - accuracy: 0.9688 Epoch 5/5 2021-12-08 17:15:14.269850: W tensorflow/core/kernels/data/cache_dataset_ops.cc:768] The calling iterator did not fully read the dataset being cached. In order to avoid unexpected truncation of the dataset, the partially cached contents of the dataset will be discarded. This can happen if you have an input pipeline similar to `dataset.cache().take(k).repeat()`. You should use `dataset.take(k).cache().repeat()` instead. 5/5 [==============================] - 0s 6ms/step - loss: 0.2006 - accuracy: 0.9719 2021-12-08 17:15:14.717552: W tensorflow/core/kernels/data/cache_dataset_ops.cc:768] The calling iterator did not fully read the dataset being cached. In order to avoid unexpected truncation of the dataset, the partially cached contents of the dataset will be discarded. This can happen if you have an input pipeline similar to `dataset.cache().take(k).repeat()`. You should use `dataset.take(k).cache().repeat()` instead. 5/5 [==============================] - 1s 4ms/step - loss: 1.4553 - accuracy: 0.5781 Loss 1.4552843570709229, Accuracy 0.578125 2021-12-08 17:15:15.862684: W tensorflow/core/kernels/data/cache_dataset_ops.cc:768] The calling iterator did not fully read the dataset being cached. In order to avoid unexpected truncation of the dataset, the partially cached contents of the dataset will be discarded. This can happen if you have an input pipeline similar to `dataset.cache().take(k).repeat()`. You should use `dataset.take(k).cache().repeat()` instead.
آموزش را سفارشی کنید و حلقه خود را بنویسید
اگر مدلهای Keras برای شما کار میکنند، اما به انعطافپذیری و کنترل بیشتری بر مرحله تمرین یا حلقههای آموزشی بیرونی نیاز دارید، میتوانید مراحل آموزشی خود یا حتی کل حلقههای آموزشی را اجرا کنید. برای اطلاعات بیشتر به راهنمای Keras در مورد سفارشی کردن fit
مراجعه کنید.
شما همچنین می توانید بسیاری از چیزها را به عنوان tf.keras.callbacks.Callback
پیاده سازی کنید.
این روش مزایای بسیاری را دارد که قبلا ذکر شد، اما کنترل پله قطار و حتی حلقه بیرونی را به شما می دهد.
سه مرحله برای یک حلقه آموزشی استاندارد وجود دارد:
- برای دریافت نمونه های دسته ای، روی یک مولد پایتون یا
tf.data.Dataset
کنید. - از
tf.GradientTape
برای جمع آوری گرادیان ها استفاده کنید. - از یکی از
tf.keras.optimizers
برای اعمال به روز رسانی وزن به متغیرهای مدل استفاده کنید.
یاد آوردن:
- همیشه یک آرگومان
training
روی روشcall
لایهها و مدلهای زیرکلاسی قرار دهید. - مطمئن شوید که مدل را با آرگومان
training
به درستی فراخوانی کنید. - بسته به استفاده، متغیرهای مدل ممکن است وجود نداشته باشند تا زمانی که مدل بر روی دسته ای از داده ها اجرا شود.
- شما باید به صورت دستی مواردی مانند ضررهای منظم سازی را برای مدل مدیریت کنید.
نیازی به اجرای اولیه سازهای متغیر یا اضافه کردن وابستگی های کنترل دستی وجود ندارد. 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)
2021-12-08 17:15:16.714849: W tensorflow/core/kernels/data/cache_dataset_ops.cc:768] The calling iterator did not fully read the dataset being cached. In order to avoid unexpected truncation of the dataset, the partially cached contents of the dataset will be discarded. This can happen if you have an input pipeline similar to `dataset.cache().take(k).repeat()`. You should use `dataset.take(k).cache().repeat()` instead. Finished epoch 0 2021-12-08 17:15:17.097043: W tensorflow/core/kernels/data/cache_dataset_ops.cc:768] The calling iterator did not fully read the dataset being cached. In order to avoid unexpected truncation of the dataset, the partially cached contents of the dataset will be discarded. This can happen if you have an input pipeline similar to `dataset.cache().take(k).repeat()`. You should use `dataset.take(k).cache().repeat()` instead. Finished epoch 1 2021-12-08 17:15:17.502480: W tensorflow/core/kernels/data/cache_dataset_ops.cc:768] The calling iterator did not fully read the dataset being cached. In order to avoid unexpected truncation of the dataset, the partially cached contents of the dataset will be discarded. This can happen if you have an input pipeline similar to `dataset.cache().take(k).repeat()`. You should use `dataset.take(k).cache().repeat()` instead. Finished epoch 2 2021-12-08 17:15:17.873701: W tensorflow/core/kernels/data/cache_dataset_ops.cc:768] The calling iterator did not fully read the dataset being cached. In order to avoid unexpected truncation of the dataset, the partially cached contents of the dataset will be discarded. This can happen if you have an input pipeline similar to `dataset.cache().take(k).repeat()`. You should use `dataset.take(k).cache().repeat()` instead. Finished epoch 3 Finished epoch 4 2021-12-08 17:15:18.344196: W tensorflow/core/kernels/data/cache_dataset_ops.cc:768] The calling iterator did not fully read the dataset being cached. In order to avoid unexpected truncation of the dataset, the partially cached contents of the dataset will be discarded. This can happen if you have an input pipeline similar to `dataset.cache().take(k).repeat()`. You should use `dataset.take(k).cache().repeat()` instead.
از tf.function
با جریان کنترل پایتون استفاده کنید
tf.function
راهی برای تبدیل جریان کنترل وابسته به داده به معادل های حالت گراف مانند tf.cond
و tf.while_loop
می دهد.
یکی از مکانهای رایج که در آن جریان کنترل وابسته به داده ظاهر میشود، مدلهای توالی است. tf.keras.layers.RNN
یک سلول RNN را میپیچد و به شما این امکان را میدهد که به صورت ایستا یا پویا بازگردانی را باز کنید. به عنوان مثال، می توانید بازگشایی پویا را به صورت زیر پیاده سازی کنید.
class DynamicRNN(tf.keras.Model):
def __init__(self, rnn_cell):
super(DynamicRNN, self).__init__(self)
self.cell = rnn_cell
@tf.function(input_signature=[tf.TensorSpec(dtype=tf.float32, shape=[None, None, 3])])
def call(self, input_data):
# [batch, time, features] -> [time, batch, features]
input_data = tf.transpose(input_data, [1, 0, 2])
timesteps = tf.shape(input_data)[0]
batch_size = tf.shape(input_data)[1]
outputs = tf.TensorArray(tf.float32, timesteps)
state = self.cell.get_initial_state(batch_size = batch_size, dtype=tf.float32)
for i in tf.range(timesteps):
output, state = self.cell(input_data[i], state)
outputs = outputs.write(i, output)
return tf.transpose(outputs.stack(), [1, 0, 2]), state
lstm_cell = tf.keras.layers.LSTMCell(units = 13)
my_rnn = DynamicRNN(lstm_cell)
outputs, state = my_rnn(tf.random.normal(shape=[10,20,3]))
print(outputs.shape)
(10, 20, 13)
برای اطلاعات بیشتر راهنمای tf.function
را بخوانید.
معیارها و ضررهای سبک جدید
معیارها و تلفات هر دو اشیایی هستند که مشتاقانه و در tf.function
s کار می کنند.
یک شی ضرر قابل فراخوانی است و ( y_true
, y_pred
) به عنوان آرگومان انتظار دارد:
cce = tf.keras.losses.CategoricalCrossentropy(from_logits=True)
cce([[1, 0]], [[-1.0,3.0]]).numpy()
4.01815
از معیارها برای جمع آوری و نمایش داده ها استفاده کنید
میتوانید از tf.metrics
برای جمعآوری دادهها و tf.summary
برای ثبت خلاصهها و هدایت آن به نویسنده با استفاده از مدیر زمینه استفاده کنید. خلاصه ها مستقیماً به نویسنده ارسال می شوند، به این معنی که شما باید مقدار step
را در callsite ارائه دهید.
summary_writer = tf.summary.create_file_writer('/tmp/summaries')
with summary_writer.as_default():
tf.summary.scalar('loss', 0.1, step=42)
از tf.metrics
برای جمع آوری داده ها قبل از ثبت آنها به عنوان خلاصه استفاده کنید. معیارها حالتی هستند. وقتی روش result
را فراخوانی می کنید، مقادیری را جمع می کنند و یک نتیجه تجمعی را برمی گردند (مانند Mean.result
). مقادیر انباشته شده را با Model.reset_states
کنید.
def train(model, optimizer, dataset, log_freq=10):
avg_loss = tf.keras.metrics.Mean(name='loss', dtype=tf.float32)
for images, labels in dataset:
loss = train_step(model, optimizer, images, labels)
avg_loss.update_state(loss)
if tf.equal(optimizer.iterations % log_freq, 0):
tf.summary.scalar('loss', avg_loss.result(), step=optimizer.iterations)
avg_loss.reset_states()
def test(model, test_x, test_y, step_num):
# training=False is only needed if there are layers with different
# behavior during training versus inference (e.g. Dropout).
loss = loss_fn(model(test_x, training=False), test_y)
tf.summary.scalar('loss', loss, step=step_num)
train_summary_writer = tf.summary.create_file_writer('/tmp/summaries/train')
test_summary_writer = tf.summary.create_file_writer('/tmp/summaries/test')
with train_summary_writer.as_default():
train(model, optimizer, dataset)
with test_summary_writer.as_default():
test(model, test_x, test_y, optimizer.iterations)
خلاصه های تولید شده را با اشاره به TensorBoard به دایرکتوری گزارش خلاصه تجسم کنید:
tensorboard --logdir /tmp/summaries
از tf.summary
API برای نوشتن داده های خلاصه برای تجسم در TensorBoard استفاده کنید. برای اطلاعات بیشتر، راهنمای tf.summary
را بخوانید.
# 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))
2021-12-08 17:15:19.339736: W tensorflow/core/kernels/data/cache_dataset_ops.cc:768] The calling iterator did not fully read the dataset being cached. In order to avoid unexpected truncation of the dataset, the partially cached contents of the dataset will be discarded. This can happen if you have an input pipeline similar to `dataset.cache().take(k).repeat()`. You should use `dataset.take(k).cache().repeat()` instead. Epoch: 0 loss: 0.142 accuracy: 0.991 2021-12-08 17:15:19.781743: W tensorflow/core/kernels/data/cache_dataset_ops.cc:768] The calling iterator did not fully read the dataset being cached. In order to avoid unexpected truncation of the dataset, the partially cached contents of the dataset will be discarded. This can happen if you have an input pipeline similar to `dataset.cache().take(k).repeat()`. You should use `dataset.take(k).cache().repeat()` instead. Epoch: 1 loss: 0.125 accuracy: 0.997 2021-12-08 17:15:20.219033: W tensorflow/core/kernels/data/cache_dataset_ops.cc:768] The calling iterator did not fully read the dataset being cached. In order to avoid unexpected truncation of the dataset, the partially cached contents of the dataset will be discarded. This can happen if you have an input pipeline similar to `dataset.cache().take(k).repeat()`. You should use `dataset.take(k).cache().repeat()` instead. Epoch: 2 loss: 0.110 accuracy: 0.997 2021-12-08 17:15:20.598085: W tensorflow/core/kernels/data/cache_dataset_ops.cc:768] The calling iterator did not fully read the dataset being cached. In order to avoid unexpected truncation of the dataset, the partially cached contents of the dataset will be discarded. This can happen if you have an input pipeline similar to `dataset.cache().take(k).repeat()`. You should use `dataset.take(k).cache().repeat()` instead. Epoch: 3 loss: 0.099 accuracy: 0.997 Epoch: 4 loss: 0.085 accuracy: 1.000 2021-12-08 17:15:20.981787: W tensorflow/core/kernels/data/cache_dataset_ops.cc:768] The calling iterator did not fully read the dataset being cached. In order to avoid unexpected truncation of the dataset, the partially cached contents of the dataset will be discarded. This can happen if you have an input pipeline similar to `dataset.cache().take(k).repeat()`. You should use `dataset.take(k).cache().repeat()` instead.
نام های متریک کراس
مدلهای Keras در مورد مدیریت نامهای متریک سازگار هستند. وقتی رشتهای را در فهرست معیارها ارسال میکنید، از آن رشته بهعنوان name
متریک استفاده میشود. این نامها در شی history که توسط 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 5ms/step - loss: 0.0963 - acc: 0.9969 - accuracy: 0.9969 - my_accuracy: 0.9969 2021-12-08 17:15:21.942940: W tensorflow/core/kernels/data/cache_dataset_ops.cc:768] The calling iterator did not fully read the dataset being cached. In order to avoid unexpected truncation of the dataset, the partially cached contents of the dataset will be discarded. This can happen if you have an input pipeline similar to `dataset.cache().take(k).repeat()`. You should use `dataset.take(k).cache().repeat()` instead.
history.history.keys()
dict_keys(['loss', 'acc', 'accuracy', 'my_accuracy'])
اشکال زدایی
از اجرای مشتاق برای اجرای گام به گام کد خود برای بررسی اشکال، انواع داده ها و مقادیر استفاده کنید. API های خاصی مانند tf.function
، tf.keras
و غیره برای استفاده از اجرای Graph، برای عملکرد و قابلیت حمل طراحی شده اند. هنگام اشکال زدایی، از tf.config.run_functions_eagerly(True)
برای استفاده از اجرای مشتاق در داخل این کد استفاده کنید.
مثلا:
@tf.function
def f(x):
if x > 0:
import pdb
pdb.set_trace()
x = x + 1
return x
tf.config.run_functions_eagerly(True)
f(tf.constant(1))
>>> f()
-> x = x + 1
(Pdb) l
6 @tf.function
7 def f(x):
8 if x > 0:
9 import pdb
10 pdb.set_trace()
11 -> x = x + 1
12 return x
13
14 tf.config.run_functions_eagerly(True)
15 f(tf.constant(1))
[EOF]
این همچنین در مدلهای Keras و سایر APIهایی که از اجرای مشتاقانه پشتیبانی میکنند نیز کار میکند:
class CustomModel(tf.keras.models.Model):
@tf.function
def call(self, input_data):
if tf.reduce_mean(input_data) > 0:
return input_data
else:
import pdb
pdb.set_trace()
return input_data // 2
tf.config.run_functions_eagerly(True)
model = CustomModel()
model(tf.constant([-2, -4]))
>>> call()
-> return input_data // 2
(Pdb) l
10 if tf.reduce_mean(input_data) > 0:
11 return input_data
12 else:
13 import pdb
14 pdb.set_trace()
15 -> return input_data // 2
16
17
18 tf.config.run_functions_eagerly(True)
19 model = CustomModel()
20 model(tf.constant([-2, -4]))
یادداشت:
روشهای
tf.keras.Model
مانندfit
،evaluate
وpredict
به صورت نمودارهایی باtf.function
در زیر سرپوش اجرا میشوند.هنگام استفاده از
tf.keras.Model.compile
،run_eagerly = True
را تنظیم کنید تا منطقModel
در یکtf.function
پیچیده نشود.از
tf.data.experimental.enable_debug_mode
برای فعال کردن حالت اشکال زدایی برایtf.data
استفاده کنید. برای جزئیات بیشتر، اسناد API را بخوانید.
tf.Tensors
را در اشیاء خود نگه ندارید
این اشیاء تانسور ممکن است در یک tf.function
یا در بافت مشتاق ایجاد شوند و این تانسورها رفتار متفاوتی دارند. همیشه از tf.Tensor
s فقط برای مقادیر متوسط استفاده کنید.
برای ردیابی وضعیت، از tf.Variable
استفاده کنید زیرا همیشه از هر دو زمینه قابل استفاده هستند. راهنمای tf.Variable
را بخوانید تا بیشتر بدانید.
منابع و مطالعه بیشتر
راهنماها و آموزش های TF2 را بخوانید تا در مورد نحوه استفاده از TF2 بیشتر بدانید.
اگر قبلاً از TF1.x استفاده کرده اید، توصیه می شود کد خود را به TF2 منتقل کنید. برای کسب اطلاعات بیشتر، راهنمای مهاجرت را بخوانید.