Cette page a été traduite par l'API Cloud Translation.
Switch to English

Estimateurs

Voir sur TensorFlow.org Exécuter dans Google Colab Afficher la source sur GitHub Télécharger le cahier

Ce document présente tf.estimator une API TensorFlow de haut niveau. Les estimateurs encapsulent les actions suivantes:

  • formation
  • évaluation
  • prédiction
  • exporter pour servir

Vous pouvez soit utiliser les estimateurs prédéfinis que nous fournissons, soit rédiger vos propres estimateurs personnalisés. Tous les Estimators, qu'ils soient tf.estimator.Estimator ou personnalisés, sont des classes basées sur la classe tf.estimator.Estimator .

Pour un exemple rapide, essayez les didacticiels Estimator . Pour un aperçu de la conception de l'API, consultez le livre blanc .

Avantages

Semblable à un tf.keras.Model , un estimator est une abstraction au niveau du modèle. Le tf.estimator fournit certaines fonctionnalités actuellement encore en développement pour tf.keras . Ceux-ci sont:

  • Formation basée sur le serveur de paramètres
  • Intégration TFX complète.

Capacités des estimateurs

Les estimateurs offrent les avantages suivants:

  • Vous pouvez exécuter des modèles basés sur Estimator sur un hôte local ou sur un environnement multi-serveur distribué sans modifier votre modèle. En outre, vous pouvez exécuter des modèles basés sur Estimator sur des processeurs, des GPU ou des TPU sans recoder votre modèle.
  • Les estimateurs fournissent une boucle de formation distribuée sûre qui contrôle comment et quand:
    • charger des données
    • gérer les exceptions
    • créer des fichiers de point de contrôle et récupérer des échecs
    • enregistrer les résumés pour TensorBoard

Lors de l'écriture d'une application avec Estimators, vous devez séparer le pipeline d'entrée de données du modèle. Cette séparation simplifie les expériences avec différents ensembles de données.

Estimateurs préfabriqués

Les estimateurs prédéfinis vous permettent de travailler à un niveau conceptuel beaucoup plus élevé que les API TensorFlow de base. Vous n'avez plus à vous soucier de la création du graphique ou des sessions de calcul puisque les estimateurs gèrent toute la «plomberie» pour vous. De plus, les estimateurs prédéfinis vous permettent d'expérimenter différentes architectures de modèle en n'apportant que des modifications minimes au code. tf.estimator.DNNClassifier , par exemple, est une classe Estimator prédéfinie qui entraîne des modèles de classification basés sur des réseaux de neurones denses et à réaction directe.

Structure d'un programme d'estimateurs prédéfini

Un programme TensorFlow reposant sur un Estimator prédéfini comprend généralement les quatre étapes suivantes:

1. Ecrivez une ou plusieurs fonctions d'importation de jeux de données.

Par exemple, vous pouvez créer une fonction pour importer l'ensemble d'apprentissage et une autre fonction pour importer l'ensemble de test. Chaque fonction d'importation de jeu de données doit renvoyer deux objets:

  • un dictionnaire dans lequel les clés sont des noms de caractéristiques et les valeurs sont des Tensors (ou SparseTensors) contenant les données de caractéristiques correspondantes
  • un Tensor contenant une ou plusieurs étiquettes

Par exemple, le code suivant illustre le squelette de base d'une fonction d'entrée:

 def input_fn(dataset):
    ...  # manipulate dataset, extracting the feature dict and the label
    return feature_dict, label
 

Consultez le guide des données pour plus de détails.

2. Définissez les colonnes de caractéristiques.

Chaque tf.feature_column identifie un nom de fonction, son type et tout prétraitement d'entrée. Par exemple, l'extrait de code suivant crée trois colonnes de caractéristiques qui contiennent des données entières ou à virgule flottante. Les deux premières colonnes de fonctionnalités identifient simplement le nom et le type de la fonctionnalité. La troisième colonne de fonctionnalité spécifie également un lambda que le programme appellera pour mettre à l'échelle les données brutes:

 # Define three numeric feature columns.
population = tf.feature_column.numeric_column('population')
crime_rate = tf.feature_column.numeric_column('crime_rate')
median_education = tf.feature_column.numeric_column(
  'median_education',
  normalizer_fn=lambda x: x - global_education_mean)
 

Pour plus d'informations, consultez le didacticiel sur les colonnes de fonctionnalités .

3. Instanciez l'estimateur prédéfini pertinent.

Par exemple, voici un exemple d'instanciation d'un Estimator LinearClassifier nommé LinearClassifier :

 # Instantiate an estimator, passing the feature columns.
estimator = tf.estimator.LinearClassifier(
  feature_columns=[population, crime_rate, median_education])
 

Pour plus d'informations, consultez le didacticiel du classificateur linéaire .

4. Appelez une méthode de formation, d'évaluation ou d'inférence.

Par exemple, tous les estimateurs fournissent une méthode de train , qui entraîne un modèle.

 # `input_fn` is the function created in Step 1
estimator.train(input_fn=my_training_set, steps=2000)
 

Vous pouvez voir un exemple ci-dessous.

Avantages des estimateurs prédéfinis

Les estimateurs prédéfinis codent les meilleures pratiques, offrant les avantages suivants:

  • Meilleures pratiques pour déterminer où les différentes parties du graphe de calcul doivent s'exécuter, implémenter des stratégies sur une seule machine ou sur un cluster.
  • Meilleures pratiques pour la rédaction d'événements (résumés) et résumés universellement utiles.

Si vous n'utilisez pas d'estimateurs prédéfinis, vous devez implémenter vous-même les fonctionnalités précédentes.

Estimateurs personnalisés

Le cœur de chaque Estimator, qu'il soit préfabriqué ou personnalisé, est sa fonction de modèle , qui est une méthode qui crée des graphiques pour l'apprentissage, l'évaluation et la prédiction. Lorsque vous utilisez un Estimator prédéfini, quelqu'un d'autre a déjà implémenté la fonction de modèle. Lorsque vous vous appuyez sur un Estimator personnalisé, vous devez écrire vous-même la fonction de modèle.

  1. En supposant qu'un Estimator prédéfini approprié existe, utilisez-le pour créer votre premier modèle et utilisez ses résultats pour établir une base de référence.
  2. Créez et testez votre pipeline global, y compris l'intégrité et la fiabilité de vos données avec cet estimateur prédéfini.
  3. Si des Estimateurs préfabriqués alternatifs appropriés sont disponibles, exécutez des expériences pour déterminer quel Estimateur préfabriqué produit les meilleurs résultats.
  4. Éventuellement, améliorez encore votre modèle en créant votre propre estimateur personnalisé.
 import tensorflow as tf
 
 import tensorflow_datasets as tfds
tfds.disable_progress_bar()
 

Créer un estimateur à partir d'un modèle Keras

Vous pouvez convertir des modèles Keras existants en Estimators avec tf.keras.estimator.model_to_estimator . Cela permet à votre modèle Keras d'accéder aux atouts d'Estimator, tels que la formation distribuée.

Instanciez un modèle Keras MobileNet V2 et compilez le modèle avec l'optimiseur, la perte et les métriques pour s'entraîner avec:

 keras_mobilenet_v2 = tf.keras.applications.MobileNetV2(
    input_shape=(160, 160, 3), include_top=False)
keras_mobilenet_v2.trainable = False

estimator_model = tf.keras.Sequential([
    keras_mobilenet_v2,
    tf.keras.layers.GlobalAveragePooling2D(),
    tf.keras.layers.Dense(1)
])

# Compile the model
estimator_model.compile(
    optimizer='adam',
    loss=tf.keras.losses.BinaryCrossentropy(from_logits=True),
    metrics=['accuracy'])
 
Downloading data from https://storage.googleapis.com/tensorflow/keras-applications/mobilenet_v2/mobilenet_v2_weights_tf_dim_ordering_tf_kernels_1.0_160_no_top.h5
9412608/9406464 [==============================] - 1s 0us/step

Créez un Estimator partir du modèle Keras compilé. L'état initial du modèle Keras est conservé dans l' Estimator créé:

 est_mobilenet_v2 = tf.keras.estimator.model_to_estimator(keras_model=estimator_model)
 
INFO:tensorflow:Using default config.
WARNING:tensorflow:Using temporary folder as model directory: /tmp/tmp3kl6ql4q
INFO:tensorflow:Using the Keras model provided.
WARNING:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.6/site-packages/tensorflow/python/ops/resource_variable_ops.py:1666: calling BaseResourceVariable.__init__ (from tensorflow.python.ops.resource_variable_ops) with constraint is deprecated and will be removed in a future version.
Instructions for updating:
If using Keras pass *_constraint arguments to layers.
INFO:tensorflow:Using config: {'_model_dir': '/tmp/tmp3kl6ql4q', '_tf_random_seed': None, '_save_summary_steps': 100, '_save_checkpoints_steps': None, '_save_checkpoints_secs': 600, '_session_config': allow_soft_placement: true
graph_options {
  rewrite_options {
    meta_optimizer_iterations: ONE
  }
}
, '_keep_checkpoint_max': 5, '_keep_checkpoint_every_n_hours': 10000, '_log_step_count_steps': 100, '_train_distribute': None, '_device_fn': None, '_protocol': None, '_eval_distribute': None, '_experimental_distribute': None, '_experimental_max_worker_delay_secs': None, '_session_creation_timeout_secs': 7200, '_service': None, '_cluster_spec': ClusterSpec({}), '_task_type': 'worker', '_task_id': 0, '_global_id_in_cluster': 0, '_master': '', '_evaluation_master': '', '_is_chief': True, '_num_ps_replicas': 0, '_num_worker_replicas': 1}

Traitez l' Estimator dérivé comme vous le feriez avec n'importe quel autre Estimator .

 IMG_SIZE = 160  # All images will be resized to 160x160

def preprocess(image, label):
  image = tf.cast(image, tf.float32)
  image = (image/127.5) - 1
  image = tf.image.resize(image, (IMG_SIZE, IMG_SIZE))
  return image, label
 
 def train_input_fn(batch_size):
  data = tfds.load('cats_vs_dogs', as_supervised=True)
  train_data = data['train']
  train_data = train_data.map(preprocess).shuffle(500).batch(batch_size)
  return train_data
 

Pour vous entraîner, appelez la fonction train d'Estimator:

 est_mobilenet_v2.train(input_fn=lambda: train_input_fn(32), steps=500)
 
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.
Downloading and preparing dataset cats_vs_dogs/4.0.0 (download: 786.68 MiB, generated: Unknown size, total: 786.68 MiB) to /home/kbuilder/tensorflow_datasets/cats_vs_dogs/4.0.0...

Warning:absl:1738 images were corrupted and were skipped

Shuffling and writing examples to /home/kbuilder/tensorflow_datasets/cats_vs_dogs/4.0.0.incompleteY3OG6H/cats_vs_dogs-train.tfrecord
Dataset cats_vs_dogs downloaded and prepared to /home/kbuilder/tensorflow_datasets/cats_vs_dogs/4.0.0. Subsequent calls will reuse this data.
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/tmp3kl6ql4q/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/tmp3kl6ql4q/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/tmp3kl6ql4q/keras/keras_model.ckpt

INFO:tensorflow:Warm-starting from: /tmp/tmp3kl6ql4q/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 158 variables.

INFO:tensorflow:Warm-started 158 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/tmp3kl6ql4q/model.ckpt.

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

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

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

INFO:tensorflow:loss = 0.7249289, step = 0

INFO:tensorflow:loss = 0.7249289, step = 0

INFO:tensorflow:global_step/sec: 20.5614

INFO:tensorflow:global_step/sec: 20.5614

INFO:tensorflow:loss = 0.67807716, step = 100 (4.865 sec)

INFO:tensorflow:loss = 0.67807716, step = 100 (4.865 sec)

INFO:tensorflow:global_step/sec: 22.1484

INFO:tensorflow:global_step/sec: 22.1484

INFO:tensorflow:loss = 0.6722798, step = 200 (4.515 sec)

INFO:tensorflow:loss = 0.6722798, step = 200 (4.515 sec)

INFO:tensorflow:global_step/sec: 21.9558

INFO:tensorflow:global_step/sec: 21.9558

INFO:tensorflow:loss = 0.60414714, step = 300 (4.555 sec)

INFO:tensorflow:loss = 0.60414714, step = 300 (4.555 sec)

INFO:tensorflow:global_step/sec: 21.9324

INFO:tensorflow:global_step/sec: 21.9324

INFO:tensorflow:loss = 0.7141589, step = 400 (4.559 sec)

INFO:tensorflow:loss = 0.7141589, step = 400 (4.559 sec)

INFO:tensorflow:Calling checkpoint listeners before saving checkpoint 500...

INFO:tensorflow:Calling checkpoint listeners before saving checkpoint 500...

INFO:tensorflow:Saving checkpoints for 500 into /tmp/tmp3kl6ql4q/model.ckpt.

INFO:tensorflow:Saving checkpoints for 500 into /tmp/tmp3kl6ql4q/model.ckpt.

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

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

INFO:tensorflow:Loss for final step: 0.6571169.

INFO:tensorflow:Loss for final step: 0.6571169.

<tensorflow_estimator.python.estimator.estimator.EstimatorV2 at 0x7f7aa444ef60>

De même, pour évaluer, appelez la fonction d'évaluation de l'estimateur:

 est_mobilenet_v2.evaluate(input_fn=lambda: train_input_fn(32), steps=10)
 
INFO:tensorflow:Calling model_fn.

INFO:tensorflow:Calling model_fn.

INFO:tensorflow:Done calling model_fn.

INFO:tensorflow:Done calling model_fn.

INFO:tensorflow:Starting evaluation at 2020-07-23T01:29:37Z

INFO:tensorflow:Starting evaluation at 2020-07-23T01:29:37Z

INFO:tensorflow:Graph was finalized.

INFO:tensorflow:Graph was finalized.

INFO:tensorflow:Restoring parameters from /tmp/tmp3kl6ql4q/model.ckpt-500

INFO:tensorflow:Restoring parameters from /tmp/tmp3kl6ql4q/model.ckpt-500

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/10]

INFO:tensorflow:Evaluation [1/10]

INFO:tensorflow:Evaluation [2/10]

INFO:tensorflow:Evaluation [2/10]

INFO:tensorflow:Evaluation [3/10]

INFO:tensorflow:Evaluation [3/10]

INFO:tensorflow:Evaluation [4/10]

INFO:tensorflow:Evaluation [4/10]

INFO:tensorflow:Evaluation [5/10]

INFO:tensorflow:Evaluation [5/10]

INFO:tensorflow:Evaluation [6/10]

INFO:tensorflow:Evaluation [6/10]

INFO:tensorflow:Evaluation [7/10]

INFO:tensorflow:Evaluation [7/10]

INFO:tensorflow:Evaluation [8/10]

INFO:tensorflow:Evaluation [8/10]

INFO:tensorflow:Evaluation [9/10]

INFO:tensorflow:Evaluation [9/10]

INFO:tensorflow:Evaluation [10/10]

INFO:tensorflow:Evaluation [10/10]

INFO:tensorflow:Inference Time : 2.13840s

INFO:tensorflow:Inference Time : 2.13840s

INFO:tensorflow:Finished evaluation at 2020-07-23-01:29:39

INFO:tensorflow:Finished evaluation at 2020-07-23-01:29:39

INFO:tensorflow:Saving dict for global step 500: accuracy = 0.60625, global_step = 500, loss = 0.63060856

INFO:tensorflow:Saving dict for global step 500: accuracy = 0.60625, global_step = 500, loss = 0.63060856

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

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

{'accuracy': 0.60625, 'loss': 0.63060856, 'global_step': 500}

Pour plus de détails, veuillez vous référer à la documentation de tf.keras.estimator.model_to_estimator .