Questa pagina è stata tradotta dall'API Cloud Translation.
Switch to English

stimatori

Visualizza su TensorFlow.org Esegui in Google Colab Visualizza sorgente su GitHub Scarica il quaderno

Questo documento introduce tf.estimator , un'API TensorFlow di alto livello. Gli stimatori incapsulano le seguenti azioni:

  • formazione
  • valutazione
  • predizione
  • esportazione per servire

È possibile utilizzare gli stimatori predefiniti forniti o scrivere i propri stimatori personalizzati. Tutti gli stimatori, prefabbricati o personalizzati, sono classi basate sulla classe tf.estimator.Estimator .

Per un rapido esempio, prova i tutorial su Estimator . Per una panoramica del design dell'API, consultare il white paper .

vantaggi

Simile a un modello tf.keras.Model , uno estimator è un'astrazione a livello di modello. tf.estimator fornisce alcune funzionalità attualmente in fase di sviluppo per tf.keras . Questi sono:

  • Formazione basata su server di parametri
  • Completa integrazione TFX .

Funzionalità degli stimatori

Gli stimatori offrono i seguenti vantaggi:

  • È possibile eseguire modelli basati su Estimator su un host locale o in un ambiente multi-server distribuito senza modificare il modello. Inoltre, è possibile eseguire modelli basati su Estimator su CPU, GPU o TPU senza ricodificare il modello.
  • Gli stimatori forniscono un ciclo di formazione distribuito sicuro che controlla come e quando:
    • caricare dati
    • gestire le eccezioni
    • creare file di checkpoint e recuperare da errori
    • salva i riepiloghi per TensorBoard

Quando si scrive un'applicazione con gli stimatori, è necessario separare la pipeline di input dei dati dal modello. Questa separazione semplifica gli esperimenti con diversi set di dati.

Stimatori prefabbricati

Gli stimatori predefiniti consentono di lavorare a un livello concettuale molto più elevato rispetto alle API TensorFlow di base. Non devi più preoccuparti di creare il grafico computazionale o le sessioni poiché gli stimatori gestiscono tutto il "sistema idraulico" per te. Inoltre, gli stimatori predefiniti consentono di sperimentare architetture di modelli diversi apportando solo modifiche minime al codice. tf.estimator.DNNClassifier , ad esempio, è una classe Estimator prefabbricata che forma modelli di classificazione basati su reti neurali dense e feed-forward.

Struttura di un programma di stimatori prefabbricato

Un programma TensorFlow basato su uno stimatore prefabbricato in genere consiste nei seguenti quattro passaggi:

1. Scrivere una o più funzioni di importazione del set di dati.

Ad esempio, è possibile creare una funzione per importare il set di addestramento e un'altra funzione per importare il set di test. Ogni funzione di importazione del set di dati deve restituire due oggetti:

  • un dizionario in cui le chiavi sono nomi di caratteristiche e i valori sono Tensori (o SparseTensor) contenenti i dati delle caratteristiche corrispondenti
  • un tensore contenente una o più etichette

Ad esempio, il seguente codice illustra lo scheletro di base per una funzione di input:

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

Vedere la guida ai dati per i dettagli.

2. Definire le colonne della funzione.

Ogni tf.feature_column identifica un nome di funzione, il suo tipo e qualsiasi pre-elaborazione dell'input. Ad esempio, il frammento seguente crea tre colonne di caratteristiche che contengono dati interi o in virgola mobile. Le prime due colonne della funzione identificano semplicemente il nome e il tipo della funzione. La terza colonna caratteristica specifica anche un lambda che il programma invocherà per ridimensionare i dati grezzi:

 # 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)
 

Per ulteriori informazioni, consultare il tutorial sulle colonne delle funzionalità .

3. Creare un'istanza dello stimatore prefabbricato pertinente.

Ad esempio, ecco un'istanza di esempio di uno stimatore pre-creato chiamato LinearClassifier :

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

Per ulteriori informazioni, consultare il tutorial del classificatore lineare .

4. Chiamare un metodo di addestramento, valutazione o inferenza.

Ad esempio, tutti gli stimatori forniscono un metodo di train , che forma un modello.

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

Di seguito puoi vedere un esempio di questo.

Vantaggi degli stimatori prefabbricati

Gli stimatori predefiniti codificano le migliori pratiche, offrendo i seguenti vantaggi:

  • Best practice per determinare dove devono essere eseguite diverse parti del grafico computazionale, implementando strategie su una singola macchina o su un cluster.
  • Best practice per la scrittura di eventi (riepilogo) e riepiloghi universalmente utili.

Se non si utilizzano gli stimatori predefiniti, è necessario implementare le funzionalità precedenti.

Stimatori personalizzati

Il cuore di ogni stimatore, prefabbricato o personalizzato, è la sua funzione modello , che è un metodo che crea grafici per formazione, valutazione e previsione. Quando si utilizza uno stimatore prefabbricato, qualcun altro ha già implementato la funzione modello. Quando si fa affidamento su uno stimatore personalizzato, è necessario scrivere manualmente la funzione del modello.

  1. Supponendo che esista uno stimatore prefabbricato adatto, usalo per costruire il tuo primo modello e usa i suoi risultati per stabilire una linea di base.
  2. Costruisci e testa la tua pipeline generale, inclusa l'integrità e l'affidabilità dei tuoi dati con questo stimatore pre-realizzato.
  3. Se sono disponibili stimatori prefabbricati alternativi adatti, eseguire esperimenti per determinare quale stimatore prefabbricato produce i risultati migliori.
  4. Forse, migliora ulteriormente il tuo modello costruendo il tuo estimatore personalizzato.
 import tensorflow as tf
 
 import tensorflow_datasets as tfds
tfds.disable_progress_bar()
 

Crea uno stimatore da un modello di Keras

Puoi convertire i modelli Keras esistenti in stimatori con tf.keras.estimator.model_to_estimator . Ciò consente al modello Keras di accedere ai punti di forza di Estimator, come l'addestramento distribuito.

Crea un'istanza di un modello Keras MobileNet V2 e compila il modello con l'ottimizzatore, la perdita e le metriche con cui allenarti:

 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

Crea uno Estimator dal modello Keras compilato. Lo stato del modello iniziale del modello Keras viene conservato Estimator creato:

 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}

Tratta lo Estimator derivato come faresti con qualsiasi altro 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
 

Per allenarsi, chiama la funzione treno 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>

Allo stesso modo, per valutare, chiama la funzione di valutazione dello stimatore:

 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}

Per ulteriori dettagli, consultare la documentazione di tf.keras.estimator.model_to_estimator .