Se usó la API de Cloud Translation para traducir esta página.
Switch to English

Estimadores prefabricados

Ver en TensorFlow.org Ejecutar en Google Colab Ver código fuente en GitHub Descargar cuaderno

Este tutorial le muestra cómo resolver el problema de clasificación de Iris en TensorFlow usando Estimadores. Un Estimador es la representación de alto nivel de TensorFlow de un modelo completo, y ha sido diseñado para facilitar el escalado y la formación asincrónica. Para más detalles ver Estimadores .

Tenga en cuenta que en TensorFlow 2.0, la API de Keras puede realizar muchas de estas mismas tareas, y se cree que es una API más fácil de aprender. Si está comenzando de nuevo, le recomendamos que comience con Keras. Para obtener más información sobre las API de alto nivel disponibles en TensorFlow 2.0, consulte Normalización en Keras .

Lo primero es lo primero

Para comenzar, primero importará TensorFlow y una serie de bibliotecas que necesitará.

 import tensorflow as tf

import pandas as pd
 

El conjunto de datos

El programa de ejemplo en este documento crea y prueba un modelo que clasifica las flores de Iris en tres especies diferentes según el tamaño de sus sépalos y pétalos .

Entrenarás un modelo utilizando el conjunto de datos de Iris. El conjunto de datos de Iris contiene cuatro características y una etiqueta . Las cuatro características identifican las siguientes características botánicas de flores de iris individuales:

  • longitud del sépalo
  • ancho sepal
  • longitud del pétalo
  • ancho de pétalo

Según esta información, puede definir algunas constantes útiles para analizar los datos:

 CSV_COLUMN_NAMES = ['SepalLength', 'SepalWidth', 'PetalLength', 'PetalWidth', 'Species']
SPECIES = ['Setosa', 'Versicolor', 'Virginica']
 

A continuación, descargue y analice el conjunto de datos de Iris usando Keras y Pandas. Tenga en cuenta que mantiene conjuntos de datos distintos para capacitación y pruebas.

 train_path = tf.keras.utils.get_file(
    "iris_training.csv", "https://storage.googleapis.com/download.tensorflow.org/data/iris_training.csv")
test_path = tf.keras.utils.get_file(
    "iris_test.csv", "https://storage.googleapis.com/download.tensorflow.org/data/iris_test.csv")

train = pd.read_csv(train_path, names=CSV_COLUMN_NAMES, header=0)
test = pd.read_csv(test_path, names=CSV_COLUMN_NAMES, header=0)
 

Puede inspeccionar sus datos para ver que tiene cuatro columnas de entidades flotantes y una etiqueta int32.

 train.head()
 

Para cada uno de los conjuntos de datos, divida las etiquetas, que el modelo será entrenado para predecir.

 train_y = train.pop('Species')
test_y = test.pop('Species')

# The label column has now been removed from the features.
train.head()
 

Descripción general de la programación con estimadores

Ahora que tiene los datos configurados, puede definir un modelo utilizando un estimador TensorFlow. Un estimador es cualquier clase derivada de tf.estimator.Estimator . TensorFlow proporciona una colección de tf.estimator (por ejemplo, LinearRegressor ) para implementar algoritmos comunes de ML. Más allá de eso, puede escribir sus propios Estimadores personalizados . Recomendamos el uso de estimadores prefabricados cuando recién comienza.

Para escribir un programa TensorFlow basado en estimadores prefabricados, debe realizar las siguientes tareas:

  • Crear una o más funciones de entrada.
  • Defina las columnas de características del modelo.
  • Instanciar un Estimador, especificando las columnas de características y varios hiperparámetros.
  • Llame a uno o más métodos en el objeto Estimador, pasando la función de entrada apropiada como la fuente de los datos.

Veamos cómo se implementan esas tareas para la clasificación de Iris.

Crear funciones de entrada

Debe crear funciones de entrada para suministrar datos para capacitación, evaluación y predicción.

Una función de entrada es una función que devuelve un objeto tf.data.Dataset que genera la siguiente tupla de dos elementos:

  • features - Un diccionario de Python en el que:
    • Cada clave es el nombre de una característica.
    • Cada valor es una matriz que contiene todos los valores de esa característica.
  • label : una matriz que contiene los valores de la etiqueta para cada ejemplo.

Solo para demostrar el formato de la función de entrada, aquí hay una implementación simple:

 def input_evaluation_set():
    features = {'SepalLength': np.array([6.4, 5.0]),
                'SepalWidth':  np.array([2.8, 2.3]),
                'PetalLength': np.array([5.6, 3.3]),
                'PetalWidth':  np.array([2.2, 1.0])}
    labels = np.array([2, 1])
    return features, labels
 

Su función de entrada puede generar el diccionario de features y la lista de label manera que desee. Sin embargo, recomendamos utilizar la API de conjunto de datos de TensorFlow, que puede analizar todo tipo de datos.

La API de conjunto de datos puede manejar muchos casos comunes para usted. Por ejemplo, utilizando la API de conjunto de datos, puede leer fácilmente registros de una gran colección de archivos en paralelo y unirlos en una sola secuencia.

Para simplificar las cosas en este ejemplo, cargará los datos con pandas y creará una tubería de entrada a partir de estos datos en memoria:

 def input_fn(features, labels, training=True, batch_size=256):
    """An input function for training or evaluating"""
    # Convert the inputs to a Dataset.
    dataset = tf.data.Dataset.from_tensor_slices((dict(features), labels))

    # Shuffle and repeat if you are in training mode.
    if training:
        dataset = dataset.shuffle(1000).repeat()
    
    return dataset.batch(batch_size)

 

Definir las columnas de características.

Una columna de características es un objeto que describe cómo el modelo debe usar datos de entrada sin procesar del diccionario de características. Cuando crea un modelo Estimator, le pasa una lista de columnas de características que describe cada una de las características que desea que use el modelo. El módulo tf.feature_column proporciona muchas opciones para representar datos en el modelo.

Para Iris, las 4 características sin procesar son valores numéricos, por lo que crearemos una lista de columnas de características para indicarle al modelo Estimator que represente cada una de las cuatro características como valores de punto flotante de 32 bits. Por lo tanto, el código para crear la columna de características es:

 # Feature columns describe how to use the input.
my_feature_columns = []
for key in train.keys():
    my_feature_columns.append(tf.feature_column.numeric_column(key=key))
 

Las columnas de características pueden ser mucho más sofisticadas que las que mostramos aquí. Puede leer más sobre las columnas de características en esta guía .

Ahora que tiene la descripción de cómo desea que el modelo represente las características sin formato, puede crear el estimador.

Instanciar un estimador

El problema de Iris es un problema clásico de clasificación. Afortunadamente, TensorFlow proporciona varios estimadores de clasificadores prefabricados, que incluyen:

Para el problema de Iris, tf.estimator.DNNClassifier parece ser la mejor opción. Así es como instanciaste este Estimador:

 # Build a DNN with 2 hidden layers with 30 and 10 hidden nodes each.
classifier = tf.estimator.DNNClassifier(
    feature_columns=my_feature_columns,
    # Two hidden layers of 30 and 10 nodes respectively.
    hidden_units=[30, 10],
    # The model must choose between 3 classes.
    n_classes=3)
 
INFO:tensorflow:Using default config.
WARNING:tensorflow:Using temporary folder as model directory: /tmp/tmpmtyfr7jr
INFO:tensorflow:Using config: {'_model_dir': '/tmp/tmpmtyfr7jr', '_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}

Entrenar, evaluar y predecir

Ahora que tiene un objeto Estimador, puede llamar a métodos para hacer lo siguiente:

  • Entrenar a la modelo.
  • Evaluar el modelo entrenado.
  • Use el modelo entrenado para hacer predicciones.

Entrenar a la modelo

Entrene el modelo llamando al método de train del Estimador de la siguiente manera:

 # Train the Model.
classifier.train(
    input_fn=lambda: input_fn(train, train_y, training=True),
    steps=5000)
 
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.
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.
WARNING:tensorflow:Layer dnn is casting an input tensor from dtype float64 to the layer's dtype of float32, which is new behavior in TensorFlow 2.  The layer has dtype float32 because it's dtype defaults to floatx.

If you intended to run this layer in float32, you can safely ignore this warning. If in doubt, this warning is likely only an issue if you are porting a TensorFlow 1.X model to TensorFlow 2.

To change all layers to have dtype float64 by default, call `tf.keras.backend.set_floatx('float64')`. To change just this layer, pass dtype='float64' to the layer constructor. If you are the author of this layer, you can disable autocasting by passing autocast=False to the base Layer constructor.

Warning:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.6/site-packages/tensorflow/python/keras/optimizer_v2/adagrad.py:106: calling Constant.__init__ (from tensorflow.python.ops.init_ops) with dtype is deprecated and will be removed in a future version.
Instructions for updating:
Call initializer instance with the dtype argument instead of passing it to the constructor
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.
INFO:tensorflow:Calling checkpoint listeners before saving checkpoint 0...
INFO:tensorflow:Saving checkpoints for 0 into /tmp/tmpmtyfr7jr/model.ckpt.
INFO:tensorflow:Calling checkpoint listeners after saving checkpoint 0...
INFO:tensorflow:loss = 1.070166, step = 0
INFO:tensorflow:global_step/sec: 331.753
INFO:tensorflow:loss = 0.93704396, step = 100 (0.302 sec)
INFO:tensorflow:global_step/sec: 395.296
INFO:tensorflow:loss = 0.89240634, step = 200 (0.253 sec)
INFO:tensorflow:global_step/sec: 403.495
INFO:tensorflow:loss = 0.86647666, step = 300 (0.248 sec)
INFO:tensorflow:global_step/sec: 399.91
INFO:tensorflow:loss = 0.83915037, step = 400 (0.250 sec)
INFO:tensorflow:global_step/sec: 396.068
INFO:tensorflow:loss = 0.81960267, step = 500 (0.253 sec)
INFO:tensorflow:global_step/sec: 397.425
INFO:tensorflow:loss = 0.8010495, step = 600 (0.251 sec)
INFO:tensorflow:global_step/sec: 382.707
INFO:tensorflow:loss = 0.7765475, step = 700 (0.261 sec)
INFO:tensorflow:global_step/sec: 387.627
INFO:tensorflow:loss = 0.7703535, step = 800 (0.258 sec)
INFO:tensorflow:global_step/sec: 394.507
INFO:tensorflow:loss = 0.7543229, step = 900 (0.253 sec)
INFO:tensorflow:global_step/sec: 407.933
INFO:tensorflow:loss = 0.73848957, step = 1000 (0.245 sec)
INFO:tensorflow:global_step/sec: 402.228
INFO:tensorflow:loss = 0.72251606, step = 1100 (0.249 sec)
INFO:tensorflow:global_step/sec: 389.775
INFO:tensorflow:loss = 0.7172867, step = 1200 (0.256 sec)
INFO:tensorflow:global_step/sec: 399.683
INFO:tensorflow:loss = 0.71068585, step = 1300 (0.250 sec)
INFO:tensorflow:global_step/sec: 391.019
INFO:tensorflow:loss = 0.69202876, step = 1400 (0.256 sec)
INFO:tensorflow:global_step/sec: 389.996
INFO:tensorflow:loss = 0.68415767, step = 1500 (0.256 sec)
INFO:tensorflow:global_step/sec: 400.404
INFO:tensorflow:loss = 0.6856695, step = 1600 (0.250 sec)
INFO:tensorflow:global_step/sec: 392.96
INFO:tensorflow:loss = 0.66869813, step = 1700 (0.254 sec)
INFO:tensorflow:global_step/sec: 391.745
INFO:tensorflow:loss = 0.6558564, step = 1800 (0.255 sec)
INFO:tensorflow:global_step/sec: 404.816
INFO:tensorflow:loss = 0.6562849, step = 1900 (0.247 sec)
INFO:tensorflow:global_step/sec: 402.047
INFO:tensorflow:loss = 0.6460574, step = 2000 (0.249 sec)
INFO:tensorflow:global_step/sec: 398.388
INFO:tensorflow:loss = 0.63663703, step = 2100 (0.251 sec)
INFO:tensorflow:global_step/sec: 398.704
INFO:tensorflow:loss = 0.637564, step = 2200 (0.251 sec)
INFO:tensorflow:global_step/sec: 395.021
INFO:tensorflow:loss = 0.6212883, step = 2300 (0.253 sec)
INFO:tensorflow:global_step/sec: 402.692
INFO:tensorflow:loss = 0.61691123, step = 2400 (0.248 sec)
INFO:tensorflow:global_step/sec: 407.281
INFO:tensorflow:loss = 0.61063623, step = 2500 (0.245 sec)
INFO:tensorflow:global_step/sec: 400.64
INFO:tensorflow:loss = 0.6003194, step = 2600 (0.250 sec)
INFO:tensorflow:global_step/sec: 409.434
INFO:tensorflow:loss = 0.5979265, step = 2700 (0.244 sec)
INFO:tensorflow:global_step/sec: 409.898
INFO:tensorflow:loss = 0.5848124, step = 2800 (0.244 sec)
INFO:tensorflow:global_step/sec: 402.807
INFO:tensorflow:loss = 0.59079146, step = 2900 (0.248 sec)
INFO:tensorflow:global_step/sec: 425.34
INFO:tensorflow:loss = 0.5736993, step = 3000 (0.235 sec)
INFO:tensorflow:global_step/sec: 433.806
INFO:tensorflow:loss = 0.58517057, step = 3100 (0.231 sec)
INFO:tensorflow:global_step/sec: 434.689
INFO:tensorflow:loss = 0.58007574, step = 3200 (0.230 sec)
INFO:tensorflow:global_step/sec: 421.99
INFO:tensorflow:loss = 0.56112236, step = 3300 (0.237 sec)
INFO:tensorflow:global_step/sec: 417.524
INFO:tensorflow:loss = 0.5660492, step = 3400 (0.240 sec)
INFO:tensorflow:global_step/sec: 420.941
INFO:tensorflow:loss = 0.54761887, step = 3500 (0.238 sec)
INFO:tensorflow:global_step/sec: 407.277
INFO:tensorflow:loss = 0.546982, step = 3600 (0.245 sec)
INFO:tensorflow:global_step/sec: 405.199
INFO:tensorflow:loss = 0.5453528, step = 3700 (0.247 sec)
INFO:tensorflow:global_step/sec: 406.092
INFO:tensorflow:loss = 0.5401837, step = 3800 (0.246 sec)
INFO:tensorflow:global_step/sec: 416.753
INFO:tensorflow:loss = 0.53336906, step = 3900 (0.240 sec)
INFO:tensorflow:global_step/sec: 405.855
INFO:tensorflow:loss = 0.52575254, step = 4000 (0.246 sec)
INFO:tensorflow:global_step/sec: 421.175
INFO:tensorflow:loss = 0.5301929, step = 4100 (0.237 sec)
INFO:tensorflow:global_step/sec: 426.782
INFO:tensorflow:loss = 0.51990014, step = 4200 (0.234 sec)
INFO:tensorflow:global_step/sec: 419.357
INFO:tensorflow:loss = 0.50317734, step = 4300 (0.238 sec)
INFO:tensorflow:global_step/sec: 420.661
INFO:tensorflow:loss = 0.5168485, step = 4400 (0.238 sec)
INFO:tensorflow:global_step/sec: 431.962
INFO:tensorflow:loss = 0.5110451, step = 4500 (0.232 sec)
INFO:tensorflow:global_step/sec: 426.04
INFO:tensorflow:loss = 0.5175854, step = 4600 (0.235 sec)
INFO:tensorflow:global_step/sec: 424.821
INFO:tensorflow:loss = 0.4986134, step = 4700 (0.235 sec)
INFO:tensorflow:global_step/sec: 431.436
INFO:tensorflow:loss = 0.5033442, step = 4800 (0.232 sec)
INFO:tensorflow:global_step/sec: 422.301
INFO:tensorflow:loss = 0.50296384, step = 4900 (0.237 sec)
INFO:tensorflow:Calling checkpoint listeners before saving checkpoint 5000...
INFO:tensorflow:Saving checkpoints for 5000 into /tmp/tmpmtyfr7jr/model.ckpt.
INFO:tensorflow:Calling checkpoint listeners after saving checkpoint 5000...
INFO:tensorflow:Loss for final step: 0.49741185.

<tensorflow_estimator.python.estimator.canned.dnn.DNNClassifierV2 at 0x7fe7dcdff668>

Tenga en cuenta que input_fn su llamada input_fn en una lambda para capturar los argumentos al tiempo que proporciona una función de entrada que no toma argumentos, como lo esperaba el Estimador. El argumento de steps le dice al método que deje de entrenar después de varios pasos de entrenamiento.

Evaluar el modelo entrenado

Ahora que el modelo ha sido entrenado, puede obtener algunas estadísticas sobre su rendimiento. El siguiente bloque de código evalúa la precisión del modelo entrenado en los datos de prueba:

 eval_result = classifier.evaluate(
    input_fn=lambda: input_fn(test, test_y, training=False))

print('\nTest set accuracy: {accuracy:0.3f}\n'.format(**eval_result))
 
INFO:tensorflow:Calling model_fn.
WARNING:tensorflow:Layer dnn is casting an input tensor from dtype float64 to the layer's dtype of float32, which is new behavior in TensorFlow 2.  The layer has dtype float32 because it's dtype defaults to floatx.

If you intended to run this layer in float32, you can safely ignore this warning. If in doubt, this warning is likely only an issue if you are porting a TensorFlow 1.X model to TensorFlow 2.

To change all layers to have dtype float64 by default, call `tf.keras.backend.set_floatx('float64')`. To change just this layer, pass dtype='float64' to the layer constructor. If you are the author of this layer, you can disable autocasting by passing autocast=False to the base Layer constructor.

INFO:tensorflow:Done calling model_fn.
INFO:tensorflow:Starting evaluation at 2020-07-23T01:36:17Z
INFO:tensorflow:Graph was finalized.
INFO:tensorflow:Restoring parameters from /tmp/tmpmtyfr7jr/model.ckpt-5000
INFO:tensorflow:Running local_init_op.
INFO:tensorflow:Done running local_init_op.
INFO:tensorflow:Inference Time : 0.21443s
INFO:tensorflow:Finished evaluation at 2020-07-23-01:36:17
INFO:tensorflow:Saving dict for global step 5000: accuracy = 0.53333336, average_loss = 0.5780506, global_step = 5000, loss = 0.5780506
INFO:tensorflow:Saving 'checkpoint_path' summary for global step 5000: /tmp/tmpmtyfr7jr/model.ckpt-5000

Test set accuracy: 0.533


A diferencia de la llamada al método train , no pasó el argumento de steps para evaluar. input_fn para eval solo produce una sola época de datos.

El eval_result diccionario también contiene el average_loss (pérdida media por muestra), la loss (pérdida media por mini lotes) y el valor del estimador del global_step (el número de iteraciones de entrenamiento sufrió).

Hacer predicciones (inferir) del modelo entrenado

Ahora tiene un modelo entrenado que produce buenos resultados de evaluación. Ahora puede usar el modelo entrenado para predecir la especie de una flor de iris basada en algunas mediciones sin etiquetar. Al igual que con el entrenamiento y la evaluación, haces predicciones usando una sola llamada de función:

 # Generate predictions from the model
expected = ['Setosa', 'Versicolor', 'Virginica']
predict_x = {
    'SepalLength': [5.1, 5.9, 6.9],
    'SepalWidth': [3.3, 3.0, 3.1],
    'PetalLength': [1.7, 4.2, 5.4],
    'PetalWidth': [0.5, 1.5, 2.1],
}

def input_fn(features, batch_size=256):
    """An input function for prediction."""
    # Convert the inputs to a Dataset without labels.
    return tf.data.Dataset.from_tensor_slices(dict(features)).batch(batch_size)

predictions = classifier.predict(
    input_fn=lambda: input_fn(predict_x))
 

El método de predict devuelve un Python iterable, produciendo un diccionario de resultados de predicción para cada ejemplo. El siguiente código imprime algunas predicciones y sus probabilidades:

 for pred_dict, expec in zip(predictions, expected):
    class_id = pred_dict['class_ids'][0]
    probability = pred_dict['probabilities'][class_id]

    print('Prediction is "{}" ({:.1f}%), expected "{}"'.format(
        SPECIES[class_id], 100 * probability, expec))
 
INFO:tensorflow:Calling model_fn.
INFO:tensorflow:Done calling model_fn.
INFO:tensorflow:Graph was finalized.
INFO:tensorflow:Restoring parameters from /tmp/tmpmtyfr7jr/model.ckpt-5000
INFO:tensorflow:Running local_init_op.
INFO:tensorflow:Done running local_init_op.
Prediction is "Setosa" (73.1%), expected "Setosa"
Prediction is "Virginica" (48.9%), expected "Versicolor"
Prediction is "Virginica" (58.6%), expected "Virginica"