Spec-Zone.ru › TensorFlow 2.9

tf.estimator.MultiHead

View source on GitHub

Создаёт Head для многоцелевого обучения.

Наследуется от: Head

Просмотр псевдонимов

Псевдонимы совместимости для миграции

См. Руководство по миграции для получения дополнительных сведений.

tf.compat.v1.estimator.MultiHead

tf.estimator.MultiHead(
    heads, head_weights=None
)

Этот класс объединяет выходные данные нескольких Head объектов. В частности:

  • Для обучения суммирует потери каждого объекта, вызывает train_op_fn с этой итоговой потерей.
  • Для оценки объединяет метрики, добавляя суффикс head.name к ключам в метриках оценки, таким как precision/head1.name, precision/head2.name.
  • Для предсказания объединяет предсказания и обновляет ключи в словаре предсказаний до 2-кортежа, (head.name, prediction_key). Объединяет export_outputs таким образом, что по умолчанию используется первый объект.

Использование:

head1 = tf.estimator.MultiLabelHead(n_classes=2, name='head1')
head2 = tf.estimator.MultiLabelHead(n_classes=3, name='head2')
multi_head = tf.estimator.MultiHead([head1, head2])
logits = {
   'head1': np.array([[-10., 10.], [-15., 10.]], dtype=np.float32),
   'head2': np.array([[20., -20., 20.], [-30., 20., -20.]],
   dtype=np.float32),}
labels = {
   'head1': np.array([[1, 0], [1, 1]], dtype=np.int64),
   'head2': np.array([[0, 1, 0], [1, 1, 0]], dtype=np.int64),}
features = {'x': np.array(((42,),), dtype=np.float32)}
# For large logits, sigmoid cross entropy loss is approximated as:
# loss = labels * (logits < 0) * (-logits) +
#        (1 - labels) * (logits > 0) * logits =>
# head1: expected_unweighted_loss = [[10., 10.], [15., 0.]]
# loss1 = ((10 + 10) / 2 + (15 + 0) / 2) / 2 = 8.75
# head2: expected_unweighted_loss = [[20., 20., 20.], [30., 0., 0]]
# loss2 = ((20 + 20 + 20) / 3 + (30 + 0 + 0) / 3) / 2 = 15.00
# loss = loss1 + loss2 = 8.75 + 15.00 = 23.75
loss = multi_head.loss(labels, logits, features=features)
print('{:.2f}'.format(loss.numpy()))
23.75
eval_metrics = multi_head.metrics()
updated_metrics = multi_head.update_metrics(
  eval_metrics, features, logits, labels)
for k in sorted(updated_metrics):
 print('{} : {:.2f}'.format(k, updated_metrics[k].result().numpy()))
auc/head1 : 0.17
auc/head2 : 0.33
auc_precision_recall/head1 : 0.60
auc_precision_recall/head2 : 0.40
average_loss/head1 : 8.75
average_loss/head2 : 15.00
loss/head1 : 8.75
loss/head2 : 15.00
preds = multi_head.predictions(logits)
print(preds[('head1', 'logits')])
tf.Tensor(
  [[-10.  10.]
   [-15.  10.]], shape=(2, 2), dtype=float32)

Использование с готовым оценщиком:

# In `input_fn`, specify labels as a dict keyed by head name:
def input_fn():
  features = ...
  labels1 = ...
  labels2 = ...
  return features, {'head1.name': labels1, 'head2.name': labels2}

# In `model_fn`, specify logits as a dict keyed by head name:
def model_fn(features, labels, mode):
  # Create simple heads and specify head name.
  head1 = tf.estimator.MultiClassHead(n_classes=3, name='head1')
  head2 = tf.estimator.BinaryClassHead(name='head2')
  # Create MultiHead from two simple heads.
  head = tf.estimator.MultiHead([head1, head2])
  # Create logits for each head, and combine them into a dict.
  logits1, logits2 = logit_fn()
  logits = {'head1.name': logits1, 'head2.name': logits2}
  # Return the merged EstimatorSpec
  return head.create_estimator_spec(..., logits=logits, ...)

# Create an estimator with this model_fn.
estimator = tf.estimator.Estimator(model_fn=model_fn)
estimator.train(input_fn=input_fn)

Также поддерживает logits в качестве Tensor формы [D0, D1, ... DN, logits_dimension]. Он разделит Tensor по последнему измерению и распределит его соответствующим образом среди объектов. Например:

# Input logits.
logits = np.array([[-1., 1., 2., -2., 2.], [-1.5, 1., -3., 2., -2.]],
                  dtype=np.float32)
# Suppose head1 and head2 have the following logits dimension.
head1.logits_dimension = 2
head2.logits_dimension = 3
# After splitting, the result will be:
logits_dict = {'head1_name': [[-1., 1.], [-1.5, 1.]],
               'head2_name':  [[2., -2., 2.], [-3., 2., -2.]]}

Использование:

def model_fn(features, labels, mode):
  # Create simple heads and specify head name.
  head1 = tf.estimator.MultiClassHead(n_classes=3, name='head1')
  head2 = tf.estimator.BinaryClassHead(name='head2')
  # Create multi-head from two simple heads.
  head = tf.estimator.MultiHead([head1, head2])
  # Create logits for the multihead. The result of logits is a `Tensor`.
  logits = logit_fn(logits_dimension=head.logits_dimension)
  # Return the merged EstimatorSpec
  return head.create_estimator_spec(..., logits=logits, ...)
Аргументы
heads Список или кортеж экземпляров Head. Все объекты должны иметь указанный name . Первый объект в списке является значением по умолчанию при работе с сервером.
head_weights Необязательный список весов, имеющий ту же длину, что и heads. Используется при объединении потерь для расчёта взвешенной суммы потерь от каждого объекта. Если None, все потери будут иметь одинаковый вес.
Атрибуты
logits_dimension Подробнее см. base_head.Head .
loss_reduction Подробнее см. base_head.Head .
name Подробнее см. base_head.Head .

Методы

create_estimator_spec

Просмотр исходного кода

create_estimator_spec(
    features,
    mode,
    logits,
    labels=None,
    optimizer=None,
    trainable_variables=None,
    train_op_fn=None,
    update_ops=None,
    regularization_losses=None
)

Возвращает model_fn.EstimatorSpec.

Аргументы
features Входные dict объектов Tensor или SparseTensor .
mode ModeKeys оценщика.
logits Входные dict с ключами по имени объекта, или логарифмы Tensor с формой [D0, D1, ... DN, logits_dimension]. В многих приложениях, форма Tensor - [batch_size, logits_dimension]. Если логарифмы представляют собой Tensor, он разделит Tensor по последнему измерению и распределит его соответствующим образом среди объектов. Проверьте MultiHead для примеров.
labels Входные dict с ключами по имени объекта. Для каждого объекта значение метки может быть целым числом или строкой Tensor с формой, соответствующей его logits. labels — обязательный аргумент, когда mode равно TRAIN или EVAL.
optimizer Экземпляр tf.keras.optimizers.Optimizer для оптимизации потерь в режиме ОБУЧЕНИЯ. Иными словами, устанавливает train_op = optimizer.get_updates(loss, trainable_variables), которое обновляет переменные для минимизации loss.
trainable_variables Список или кортеж объектов Variable для обновления, чтобы минимизировать loss. В TensorFlow 1.x, по умолчанию это список переменных, собранных в графе под ключом GraphKeys.TRAINABLE_VARIABLES. Поскольку TensorFlow 2.x не имеет коллекций и GraphKeys, trainable_variables необходимо передавать явно здесь.
train_op_fn Функция, которая принимает скалярную потерю Tensor и возвращает train_op. Используется, если optimizer равно None.
update_ops Список или кортеж операций обновления, которые выполняются во время обучения. Например, слои, такие как BatchNormalization, создают операции обновления среднего и дисперсии, которые необходимо выполнить во время обучения. В TensorFlow 1.x они помещаются в коллекцию UPDATE_OPS. Поскольку TensorFlow 2.x не имеет коллекций, update_ops необходимо передавать явно здесь.
regularization_losses Список дополнительных скалярных потерь, которые должны быть добавлены к тренировочной потере, такие как потери регуляризации. Эти потери обычно выражаются как среднее значение пакета, поэтому для достижения наилучших результатов пользователям в каждом объекте необходимо использовать значение по умолчанию loss_reduction=SUM_OVER_BATCH_SIZE для предотвращения ошибок масштабирования. В отличие от потерь регуляризации для каждого объекта, эта потеря предназначена для регуляризации объединённой потери всех объектов в многообъектном объекте и будет добавлена к общей тренировочной потере многообъектного объекта.
Возвращает
Экземпляр model_fn.EstimatorSpec .
Исключения
ValueError Если train_op_fn и optimizer являются None в режиме ОБУЧЕНИЯ, или если оба установлены. Если mode отсутствует в ModeKeys оценщика.

loss

Просмотр исходного кода

loss(
    labels, logits, features=None, mode=None, regularization_losses=None
)

Возвращает регулярную тренировочную потерю. См. base_head.Head для получения подробной информации.

metrics

Просмотр исходного кода

metrics(
    regularization_losses=None
)

Создаёт метрики. См. base_head.Head для получения подробной информации.

predictions

Просмотр исходного кода

predictions(
    logits, keys=None
)

Создаёт предсказания. См. base_head.Head для получения подробной информации.

update_metrics

Просмотр исходного кода

update_metrics(
    eval_metrics, features, logits, labels, regularization_losses=None
)

Обновляет метрики оценки. См. base_head.Head для получения подробной информации.

© 2022 The TensorFlow Authors. All rights reserved.
Licensed under the Creative Commons Attribution License 4.0.
Code samples licensed under the Apache 2.0 License.
https://www.tensorflow.org/versions/r2.9/api_docs/python/tf/estimator/MultiHead

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API