Оценщики

Смотрите на TensorFlow.org Запустите в Google Colab Изучайте код на GitHub Скачайте ноутбук

Этот документ знакомит с tf.estimator — высокоуровневым TensorFlow API. Оценщики включают следующие действия:

  • обучение
  • оценка
  • предсказание
  • экспорт для serving

Вы можете использовать созданные нами оценщики или собственные кастомные оценщики. Все оценщики - как созданные нами, так и пользовательские - являются классами, основанными на классе tf.estimator.Estimator.

Быстрый пример можно посмотреть в Учебниках по оценщикам. Обзор структуры API приведен в статье.

Преимущества

Аналогично tf.keras.Model, estimator это абстракция на уровне модели. tf.estimator предоставляет некоторые возможности, которые все еще находятся в стадии разработки для tf.keras. Это:

  • Обучение на сервере параметров
  • Полная TFX интеграция.

Возможности оценщиков

Оценщики предоставляют следующие преимущества:

  • Вы можете запускать модели на основе оценщиков на локальном компьютере или в распределенной многосерверной среде без изменения вашей модели. Кроме того, вы можете запускать модели на основе оценщиков на CPU, GPU, или TPU без изменения исходного кода вашей модели.
  • Оценщики обеспечивают безопасный распределенный цикл обучения, который контролирует каким образом и когда:
    • загружаются данные
    • обрабатываются исключения
    • создаваются файлы чекпоинтов и восстанавливаться после сбоев
    • сохраняются сводные данные для TensorBoard

При написании приложения с оценщиками, вы должны отделить конвейер входных данных от модели. Это разделение упрощает эксперименты с различными наборами данных.

Готовые оценщики

Предварительно созданные оценщики позволяют вам работать на гораздо более высоком концептуальном уровне, чем базовые API TensorFlow. Вам больше не нужно беспокоиться о создании вычислительного графа или сессий, поскольку оценщики делают всю "грязную работу" за вас. Кроме того, оценщики, позволяют вам экспериментировать с различными архитектурами моделей, внося только минимальные изменения в код. tf.estimator.DNNClassifier, например, представляет собой заранее подготовленный класс Estimator, который обучает модели классификации на основе полносвязных нейронных сетей прямого распространения.

Структура программы на готовом оценщике

Создание программы TensorFlow на готовом оценщике обычно состоит из четырех этапов:

1. Напишите одну или несколько функций импорта данных.

Например, вы можете создать одну функцию для импорта тренировочных данных и другую функцию для импорта тестовых данных. Каждая функция импорта данных должна возвращать дваа объекта:

  • словарь, в котором ключами являются имена признаков, а значениями - тензоры (Tensor или SparseTensor), содержащие соответствующие признаку данные
  • Tensor, содержащий одну или более меток

Например, следующий код иллюстрирует базовый каркас для входной функции:

def input_fn(dataset):
    ...  # манипулирет датасетом, извлекает словарь со свойствами и метку
    return feature_dict, label

See data guide for details.

2. Определяет столбцы свойств.

Каждый tf.feature_column определяет имя признака, его тип и любую предобработку. Например, следующий фрагмент кода создает три столбца признаков содержащих целые числа или значения с плавающей точкой. Первые два столбца признаков просто идентифицируют имя признака и тип. Третий столбец признаков определяет лямбду - программу которая будет вызвана для масштабирования сырых данных:

# Определим три столбца с числовыми признаками.
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)

Для дополнительной информации см. учебник по столбцам признаков.

3. Создание экземпляра готового оценщика.

Например, вот как можно просто создать экземпляр оценщика LinearClassifier:Например, вот как можно просто создать экземпляр оценщика LinearClassifier:

# Создадим экземпляр оценщика, передав столбцы признаков.
estimator = tf.estimator.LinearClassifier(
  feature_columns=[population, crime_rate, median_education])

Для дополнительной информации см. учебник линейной классификации.

4. Вызов метода обучения, оценки или вывода.

Например, все оценщики предоставляют метод train который обучает модель.

# `input_fn` это функция созданная на шаге 1
estimator.train(input_fn=my_training_set, steps=2000)

Вы можете видеть пример этого ниже.

Преимущества готовых оценщиков

Готовые оценщики включают в себя лучшие практики, предоставляя следующие преимущества:

  • Лучшие практики для определения того, где должны выполняться различные части вычислительного графа, реализуя стратегии на одной машине или на кластер.
  • Лучшие практики для написания событий (сводок) и универсально полезные сводки.

Если вы не используете готовые оценщики, вам нужно реализовать предыдущие функции самостоятельно.

Кастомные оценщики

Сердцем каждого оценщика, будь он готовый или кастомный, является его функция модели, которая представляет собой метод построения графов для обучения, оценки и прогнозирования. Когда вы используете готовый оценщик, кто-то за вас уже реализовал функцию модели. Если вы пологаетесь на кастомнного оценщика, вам нужно написать функцию модели самостоятельно

Рекомендуемый процесс работы

  1. Предполагая, что существует готовый оценщик, используйте его для посторения своей первой модели и используйте его результаты для определения бейзлайна.
  2. Создайте и протестируйте весь конвейер, включая целостность и надежность ваших данных с этим готовым оценщиком.
  3. Если имеются другие подходящие готовые оценщики, проведите эксперименты какой из готовых оценщиков дает лучшие результаты.
  4. Возможно еще улучшить вашу модель созданием кастомного оценщика.
import tensorflow as tf
import tensorflow_datasets as tfds
tfds.disable_progress_bar()

Создание оценщика из модели Keras

Вы можете конвертировать существующие модели Keras models в оценщики с помощью tf.keras.estimator.model_to_estimator. Это позволяет вашей модели Keras получить сильные стороны оценщиков, такие как, например, распределенное обучение.

Создайте экземпляр модели Keras MobileNet V2 и скомпилируйте модель с оптимизатором, потерями и метриками необходимыми для обучения:

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.Flatten(),
    tf.keras.layers.Dense(1, activation='softmax')
])

# Компилируем модель
estimator_model.compile(
    optimizer='adam',
    loss='binary_crossentropy',
    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 [==============================] - 0s 0us/step

Создайте Estimator из скомпилированной модели Keras. Начальное состояние модели Keras сохранено в созданном Estimator:

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/tmpwovc_iix
INFO:tensorflow:Using the Keras model provided.
WARNING:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.6/site-packages/tensorflow_estimator/python/estimator/keras.py:220: set_learning_phase (from tensorflow.python.keras.backend) is deprecated and will be removed after 2020-10-11.
Instructions for updating:
Simply pass a True/False value to the `training` argument of the `__call__` method of your layer or model.
INFO:tensorflow:Using config: {'_model_dir': '/tmp/tmpwovc_iix', '_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}

Относитесь к полученному Estimator так же как к любому другому Estimator.

IMG_SIZE = 160  # Размер всех изображений будет приведен к 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

Для обучения вызовите функцию обучения оценщика:

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.incompleteCYHI5L/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/tmpwovc_iix/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/tmpwovc_iix/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/tmpwovc_iix/keras/keras_model.ckpt

INFO:tensorflow:Warm-starting from: /tmp/tmpwovc_iix/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/tmpwovc_iix/model.ckpt.

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

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

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

INFO:tensorflow:loss = 7.6666193, step = 0

INFO:tensorflow:loss = 7.6666193, step = 0

INFO:tensorflow:global_step/sec: 24.7842

INFO:tensorflow:global_step/sec: 24.7842

INFO:tensorflow:loss = 8.145783, step = 100 (4.036 sec)

INFO:tensorflow:loss = 8.145783, step = 100 (4.036 sec)

INFO:tensorflow:global_step/sec: 26.5914

INFO:tensorflow:global_step/sec: 26.5914

INFO:tensorflow:loss = 6.708292, step = 200 (3.761 sec)

INFO:tensorflow:loss = 6.708292, step = 200 (3.761 sec)

INFO:tensorflow:global_step/sec: 26.5402

INFO:tensorflow:global_step/sec: 26.5402

INFO:tensorflow:loss = 7.6666193, step = 300 (3.767 sec)

INFO:tensorflow:loss = 7.6666193, step = 300 (3.767 sec)

INFO:tensorflow:global_step/sec: 26.5794

INFO:tensorflow:global_step/sec: 26.5794

INFO:tensorflow:loss = 7.66662, step = 400 (3.762 sec)

INFO:tensorflow:loss = 7.66662, step = 400 (3.762 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/tmpwovc_iix/model.ckpt.

INFO:tensorflow:Saving checkpoints for 500 into /tmp/tmpwovc_iix/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: 7.6666193.

INFO:tensorflow:Loss for final step: 7.6666193.

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

Аналогично, для оценки вызовите функцию оценки оценщика:

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

INFO:tensorflow:Calling model_fn.

Warning:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.6/site-packages/tensorflow/python/keras/engine/training_v1.py:2048: Model.state_updates (from tensorflow.python.keras.engine.training) is deprecated and will be removed in a future version.
Instructions for updating:
This property should not be used in TensorFlow 2.0, as updates are applied automatically.

Warning:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.6/site-packages/tensorflow/python/keras/engine/training_v1.py:2048: Model.state_updates (from tensorflow.python.keras.engine.training) is deprecated and will be removed in a future version.
Instructions for updating:
This property should not be used in TensorFlow 2.0, as updates are applied automatically.

INFO:tensorflow:Done calling model_fn.

INFO:tensorflow:Done calling model_fn.

INFO:tensorflow:Starting evaluation at 2020-09-22T18:18:32Z

INFO:tensorflow:Starting evaluation at 2020-09-22T18:18:32Z

INFO:tensorflow:Graph was finalized.

INFO:tensorflow:Graph was finalized.

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

INFO:tensorflow:Restoring parameters from /tmp/tmpwovc_iix/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 : 1.75251s

INFO:tensorflow:Inference Time : 1.75251s

INFO:tensorflow:Finished evaluation at 2020-09-22-18:18:34

INFO:tensorflow:Finished evaluation at 2020-09-22-18:18:34

INFO:tensorflow:Saving dict for global step 500: accuracy = 0.471875, global_step = 500, loss = 8.053504

INFO:tensorflow:Saving dict for global step 500: accuracy = 0.471875, global_step = 500, loss = 8.053504

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

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

{'accuracy': 0.471875, 'loss': 8.053504, 'global_step': 500}

Дополнительную информацию можно получить в документации по tf.keras.estimator.model_to_estimator.