Lihat di TensorFlow.org | Jalankan di Google Colab | Lihat sumber di GitHub | Unduh buku catatan |
Evaluasi adalah bagian penting dari model pengukuran dan benchmarking.
Panduan ini menunjukkan cara memigrasikan tugas evaluator dari TensorFlow 1 ke TensorFlow 2. Di Tensorflow 1 fungsi ini diterapkan oleh tf.estimator.train_and_evaluate
, saat API berjalan secara terdistribusi. Di Tensorflow 2, Anda dapat menggunakan tf.keras.utils.SidecarEvaluator
, atau loop evaluasi khusus pada tugas evaluator.
Ada opsi evaluasi serial sederhana di TensorFlow 1 ( tf.estimator.Estimator.evaluate
) dan TensorFlow 2 ( Model.fit(..., validation_data=(...))
atau Model.evaluate
). Tugas evaluator lebih disukai bila Anda ingin pekerja Anda tidak beralih antara pelatihan dan evaluasi, dan evaluasi bawaan di Model.fit
lebih disukai bila Anda ingin evaluasi Anda didistribusikan.
Mempersiapkan
import tensorflow.compat.v1 as tf1
import tensorflow as tf
import numpy as np
import tempfile
import time
import os
mnist = tf.keras.datasets.mnist
(x_train, y_train),(x_test, y_test) = mnist.load_data()
x_train, x_test = x_train / 255.0, x_test / 255.0
Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/mnist.npz 11493376/11490434 [==============================] - 0s 0us/step 11501568/11490434 [==============================] - 0s 0us/step
TensorFlow 1: Mengevaluasi menggunakan tf.estimator.train_and_evaluate
Di TensorFlow 1, Anda dapat mengonfigurasi tf.estimator
untuk mengevaluasi estimator menggunakan tf.estimator.train_and_evaluate
.
Dalam contoh ini, mulailah dengan mendefinisikan tf.estimator.Estimator
dan menentukan spesifikasi pelatihan dan evaluasi:
feature_columns = [tf1.feature_column.numeric_column("x", shape=[28, 28])]
classifier = tf1.estimator.DNNClassifier(
feature_columns=feature_columns,
hidden_units=[256, 32],
optimizer=tf1.train.AdamOptimizer(0.001),
n_classes=10,
dropout=0.2
)
train_input_fn = tf1.estimator.inputs.numpy_input_fn(
x={"x": x_train},
y=y_train.astype(np.int32),
num_epochs=10,
batch_size=50,
shuffle=True,
)
test_input_fn = tf1.estimator.inputs.numpy_input_fn(
x={"x": x_test},
y=y_test.astype(np.int32),
num_epochs=10,
shuffle=False
)
train_spec = tf1.estimator.TrainSpec(input_fn=train_input_fn, max_steps=10)
eval_spec = tf1.estimator.EvalSpec(input_fn=test_input_fn,
steps=10,
throttle_secs=0)
INFO:tensorflow:Using default config. WARNING:tensorflow:Using temporary folder as model directory: /tmp/tmpv82biaa9 INFO:tensorflow:Using config: {'_model_dir': '/tmp/tmpv82biaa9', '_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} WARNING:tensorflow:From /tmp/ipykernel_20878/122738158.py:11: The name tf.estimator.inputs is deprecated. Please use tf.compat.v1.estimator.inputs instead. WARNING:tensorflow:From /tmp/ipykernel_20878/122738158.py:11: The name tf.estimator.inputs.numpy_input_fn is deprecated. Please use tf.compat.v1.estimator.inputs.numpy_input_fn instead.
Kemudian, latih dan evaluasi model tersebut. Evaluasi berjalan serempak antar pelatihan karena dibatasi sebagai lari lokal di notebook ini dan bergantian antara pelatihan dan evaluasi. Namun, jika estimator digunakan secara terdistribusi, evaluator akan berjalan sebagai tugas evaluator khusus. Untuk informasi lebih lanjut, lihat panduan migrasi pada pelatihan terdistribusi .
tf1.estimator.train_and_evaluate(estimator=classifier,
train_spec=train_spec,
eval_spec=eval_spec)
INFO:tensorflow:Not using Distribute Coordinator. 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. WARNING:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow/python/training/training_util.py:397: 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.7/site-packages/tensorflow_estimator/python/estimator/inputs/queues/feeding_queue_runner.py:65: QueueRunner.__init__ (from tensorflow.python.training.queue_runner_impl) is deprecated and will be removed in a future version. Instructions for updating: To construct input pipelines, use the `tf.data` module. WARNING:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow_estimator/python/estimator/inputs/queues/feeding_functions.py:491: add_queue_runner (from tensorflow.python.training.queue_runner_impl) is deprecated and will be removed in a future version. Instructions for updating: To construct input pipelines, use the `tf.data` module. INFO:tensorflow:Calling model_fn. INFO:tensorflow:Done calling model_fn. INFO:tensorflow:Create CheckpointSaverHook. INFO:tensorflow:Graph was finalized. INFO:tensorflow:Running local_init_op. INFO:tensorflow:Done running local_init_op. WARNING:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow/python/training/monitored_session.py:914: start_queue_runners (from tensorflow.python.training.queue_runner_impl) is deprecated and will be removed in a future version. Instructions for updating: To construct input pipelines, use the `tf.data` module. INFO:tensorflow:Calling checkpoint listeners before saving checkpoint 0... INFO:tensorflow:Saving checkpoints for 0 into /tmp/tmpv82biaa9/model.ckpt. INFO:tensorflow:Calling checkpoint listeners after saving checkpoint 0... INFO:tensorflow:loss = 118.02926, step = 0 INFO:tensorflow:Calling checkpoint listeners before saving checkpoint 10... INFO:tensorflow:Saving checkpoints for 10 into /tmp/tmpv82biaa9/model.ckpt. INFO:tensorflow:Calling checkpoint listeners after saving checkpoint 10... INFO:tensorflow:Calling model_fn. INFO:tensorflow:Done calling model_fn. INFO:tensorflow:Starting evaluation at 2022-01-19T02:31:38 INFO:tensorflow:Graph was finalized. INFO:tensorflow:Restoring parameters from /tmp/tmpv82biaa9/model.ckpt-10 INFO:tensorflow:Running local_init_op. INFO:tensorflow:Done running local_init_op. INFO:tensorflow:Evaluation [1/10] INFO:tensorflow:Evaluation [2/10] INFO:tensorflow:Evaluation [3/10] INFO:tensorflow:Evaluation [4/10] INFO:tensorflow:Evaluation [5/10] INFO:tensorflow:Evaluation [6/10] INFO:tensorflow:Evaluation [7/10] INFO:tensorflow:Evaluation [8/10] INFO:tensorflow:Evaluation [9/10] INFO:tensorflow:Evaluation [10/10] INFO:tensorflow:Inference Time : 0.29827s INFO:tensorflow:Finished evaluation at 2022-01-19-02:31:38 INFO:tensorflow:Saving dict for global step 10: accuracy = 0.4953125, average_loss = 1.8270489, global_step = 10, loss = 233.86226 INFO:tensorflow:Saving 'checkpoint_path' summary for global step 10: /tmp/tmpv82biaa9/model.ckpt-10 INFO:tensorflow:Loss for final step: 92.23195. ({'accuracy': 0.4953125, 'average_loss': 1.8270489, 'loss': 233.86226, 'global_step': 10}, [])
TensorFlow 2: Mengevaluasi model Keras
Di TensorFlow 2, jika Anda menggunakan Keras Model.fit
API untuk pelatihan, Anda dapat mengevaluasi model dengan tf.keras.utils.SidecarEvaluator
. Anda juga dapat memvisualisasikan metrik evaluasi di Tensorboard yang tidak ditampilkan dalam panduan ini.
Untuk membantu mendemonstrasikan ini, pertama-tama mari kita mulai dengan mendefinisikan dan melatih model:
def create_model():
return tf.keras.models.Sequential([
tf.keras.layers.Flatten(input_shape=(28, 28)),
tf.keras.layers.Dense(512, activation='relu'),
tf.keras.layers.Dropout(0.2),
tf.keras.layers.Dense(10)
])
loss = tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True)
model = create_model()
model.compile(optimizer='adam',
loss=loss,
metrics=['accuracy'],
steps_per_execution=10,
run_eagerly=True)
log_dir = tempfile.mkdtemp()
model_checkpoint = tf.keras.callbacks.ModelCheckpoint(
filepath=os.path.join(log_dir, 'ckpt-{epoch}'),
save_weights_only=True)
model.fit(x=x_train,
y=y_train,
epochs=1,
callbacks=[model_checkpoint])
1875/1875 [==============================] - 27s 14ms/step - loss: 0.2202 - accuracy: 0.9350 <keras.callbacks.History at 0x7f534c8dbed0>
Kemudian, evaluasi model menggunakan tf.keras.utils.SidecarEvaluator
. Dalam pelatihan nyata, disarankan untuk menggunakan pekerjaan terpisah untuk melakukan evaluasi guna membebaskan sumber daya pekerja untuk pelatihan.
data = tf.data.Dataset.from_tensor_slices((x_test, y_test))
data = data.batch(64)
tf.keras.utils.SidecarEvaluator(
model=model,
data=data,
checkpoint_dir=log_dir,
max_evaluations=1
).start()
INFO:tensorflow:Waiting for new checkpoint at /tmp/tmpl6y5s71p INFO:tensorflow:Found new checkpoint at /tmp/tmpl6y5s71p/ckpt-1 INFO:tensorflow:Evaluation starts: Model weights loaded from latest checkpoint file /tmp/tmpl6y5s71p/ckpt-1 157/157 - 2s - loss: 0.1006 - accuracy: 0.9697 - 2s/epoch - 10ms/step INFO:tensorflow:End of evaluation. Metrics: loss=0.10060054063796997 accuracy=0.9696999788284302 INFO:tensorflow:Last checkpoint evaluated. SidecarEvaluator stops.
Langkah selanjutnya
- Untuk mempelajari lebih lanjut tentang evaluasi sespan, pertimbangkan untuk membaca dokumen
tf.keras.utils.SidecarEvaluator
API. - Untuk mempertimbangkan pelatihan dan evaluasi bergantian di Keras, pertimbangkan untuk membaca tentang metode bawaan lainnya .