tf.estimator.train_and_evaluate
| Просмотреть исходный код на GitHub |
Обучить и оценить estimator.
tf.estimator.train_and_evaluate(
estimator, train_spec, eval_spec
)
Эта служебная функция обучает, оценивает и (необязательно) экспортирует модель, используя заданные estimator. Все спецификации, относящиеся к обучению, содержатся в train_spec, включая параметры обучения input_fn и максимальное количество шагов обучения и т. д. Все спецификации, относящиеся к оценке и экспорту, содержатся в eval_spec, включая параметры оценки input_fn, шаги и т. д.
Эта служебная функция обеспечивает согласованное поведение для локальных (нераспределённых) и распределённых конфигураций. По умолчанию используется распределение, основанное на серверах параметров, с репликацией между графами. Для других типов распределённых конфигураций, таких как обучение с помощью all-reduce, используйте DistributionStrategies.
Переобучение: для предотвращения переобучения рекомендуется настроить параметры обучения input_fn для надлежащего перемешивания обучающих данных.
Условие остановки: для надёжной поддержки распределённых и нераспределённых конфигураций единственным поддерживаемым условием остановки для обучения модели является train_spec.max_steps. Если train_spec.max_steps равно None, модель будет обучаться бесконечно. Используйте с осторожностью, если условие остановки модели отличается. Например, предположим, что ожидается обучение модели с одной эпохой обучающих данных, и параметры обучения input_fn настроены на выброс OutOfRangeError после прохождения одной эпохи, что останавливает Estimator.train. В случае распределённой конфигурации с тремя рабочими узлами для обучения, каждый рабочий узел, скорее всего, пройдёт через всю эпоху независимо. Таким образом, модель будет обучена с тремя эпохами обучающих данных вместо одной.
Пример локального (нераспределённого) обучения:
# Set up feature columns.
categorial_feature_a = categorial_column_with_hash_bucket(...)
categorial_feature_a_emb = embedding_column(
categorical_column=categorial_feature_a, ...)
... # other feature columns
estimator = DNNClassifier(
feature_columns=[categorial_feature_a_emb, ...],
hidden_units=[1024, 512, 256])
# Or set up the model directory
# estimator = DNNClassifier(
# config=tf.estimator.RunConfig(
# model_dir='/my_model', save_summary_steps=100),
# feature_columns=[categorial_feature_a_emb, ...],
# hidden_units=[1024, 512, 256])
# Input pipeline for train and evaluate.
def train_input_fn(): # returns x, y
# please shuffle the data.
pass
def eval_input_fn(): # returns x, y
pass
train_spec = tf.estimator.TrainSpec(input_fn=train_input_fn, max_steps=1000)
eval_spec = tf.estimator.EvalSpec(input_fn=eval_input_fn)
tf.estimator.train_and_evaluate(estimator, train_spec, eval_spec)
Обратите внимание, что в текущей реализации estimator.evaluate будет вызываться несколько раз. Это означает, что граф оценки (включая eval_input_fn) будет пересоздаваться для каждого вызова evaluate. estimator.train будет вызван только один раз.
Пример распределённого обучения:
Что касается примера распределённого обучения, приведенный код можно использовать без изменений (убедитесь, что RunConfig.model_dir для всех рабочих узлов задан в одном и том же каталоге, т. е. в общей файловой системе, к которой все рабочие узлы имеют доступ для чтения и записи). Единственное дополнительное действие — правильная установка переменной среды TF_CONFIG для каждого рабочего узла соответственно.
Также см. Распределённый TensorFlow.
Установка переменной среды зависит от платформы. Например, в Linux это можно сделать следующим образом ($ — приглашение командной строки):
$ TF_CONFIG='<replace_with_real_content>' python train_model.py
Для содержимого TF_CONFIG, предположим, что спецификация кластера для обучения выглядит следующим образом:
cluster = {"chief": ["host0:2222"],
"worker": ["host1:2222", "host2:2222", "host3:2222"],
"ps": ["host4:2222", "host5:2222"]}
Пример TF_CONFIG для главного рабочего узла обучения (должен быть один и только один):
# This should be a JSON string, which is set as environment variable. Usually
# the cluster manager handles that.
TF_CONFIG='{
"cluster": {
"chief": ["host0:2222"],
"worker": ["host1:2222", "host2:2222", "host3:2222"],
"ps": ["host4:2222", "host5:2222"]
},
"task": {"type": "chief", "index": 0}
}'
Обратите внимание, что главный рабочий узел также выполняет работу по обучению модели, аналогично другим рабочим узлам (см. следующий абзац). В дополнение к обучению модели он выполняет дополнительные задачи, например, сохранение и восстановление контрольных точек, запись сводок и т. д.
Пример TF_CONFIG для рабочих узлов обучения, не являющихся главными (необязательно, может быть несколько):
# This should be a JSON string, which is set as environment variable. Usually
# the cluster manager handles that.
TF_CONFIG='{
"cluster": {
"chief": ["host0:2222"],
"worker": ["host1:2222", "host2:2222", "host3:2222"],
"ps": ["host4:2222", "host5:2222"]
},
"task": {"type": "worker", "index": 0}
}'
где task.index должно быть установлено как 0, 1, 2 в этом примере соответственно для рабочих узлов, не являющихся главными.
Пример TF_CONFIG для сервера параметров, сокращённо ps (может быть несколько):
# This should be a JSON string, which is set as environment variable. Usually
# the cluster manager handles that.
TF_CONFIG='{
"cluster": {
"chief": ["host0:2222"],
"worker": ["host1:2222", "host2:2222", "host3:2222"],
"ps": ["host4:2222", "host5:2222"]
},
"task": {"type": "ps", "index": 0}
}'
где task.index должно быть установлено как 0 и 1 в этом примере соответственно для серверов параметров.
Пример TF_CONFIG для задачи оценки. Задача оценки — специальная задача, которая не является частью кластера для обучения. Их может быть только одна. Она используется для оценки модели.
# This should be a JSON string, which is set as environment variable. Usually
# the cluster manager handles that.
TF_CONFIG='{
"cluster": {
"chief": ["host0:2222"],
"worker": ["host1:2222", "host2:2222", "host3:2222"],
"ps": ["host4:2222", "host5:2222"]
},
"task": {"type": "evaluator", "index": 0}
}'
Когда distribute или experimental_distribute.train_distribute и experimental_distribute.remote_cluster заданы, этот метод запустит клиент на текущем узле, который подключится к remote_cluster для обучения и оценки.
| Аргументы | |
|---|---|
estimator | Экземпляр Estimator для обучения и оценки. |
train_spec | Экземпляр TrainSpec для задания параметров обучения. |
eval_spec | Экземпляр EvalSpec для задания параметров оценки и экспорта. |
| Возвращаемые значения | |
|---|---|
Кортеж результата вызова evaluate к Estimator и результатов экспорта, используя заданные Exporter. В настоящее время возвращаемое значение не определено для режима распределённого обучения. |
| Исключения | |
|---|---|
ValueError | если переменная среды TF_CONFIG задана неправильно. |
© 2020 The TensorFlow Authors. All rights reserved.
Licensed under the Creative Commons Attribution License 3.0.
Code samples licensed under the Apache 2.0 License.
https://www.tensorflow.org/versions/r2.4/api_docs/python/tf/estimator/train_and_evaluate