Интеграция MinDiff с MinDiffModel

Введение

Есть два шага для интеграции MinDiff в вашу модель:

  1. Подготовьте данные (покрытые в руководстве подготовки ввода ).

  2. Измените или создайте модель, которая будет интегрировать MinDiff во время обучения.

Это руководство будет охватывать самый простой способ , чтобы завершить второй шаг: с помощью MinDiffModel .

Настраивать

pip install -q --upgrade tensorflow-model-remediation
import tensorflow as tf
tf.get_logger().setLevel('ERROR')  # Avoid TF warnings.
from tensorflow_model_remediation import min_diff
from tensorflow_model_remediation.tools.tutorials_utils import uci as tutorials_utils

Сначала загрузите данные. Для краткости, логика ввода препарата была вынесена в вспомогательные функции , как описано в руководстве подготовки ввода . Вы можете прочитать полное руководство для получения подробной информации об этом процессе.

# Original DataFrame for training, sampled at 0.3 for reduced runtimes.
train_df = tutorials_utils.get_uci_data(split='train', sample=0.3)

# Dataset needed to train with MinDiff.
train_with_min_diff_ds = (
    tutorials_utils.get_uci_with_min_diff_dataset(split='train', sample=0.3))

Оригинальная модель

Это руководство использует базовое, расстроенное keras.Model с использованием функционального API , чтобы выделить с помощью MinDiff. В реальном приложении вы должны тщательно выбрать архитектуру модели и использовать настройку для улучшения качества модели, прежде чем пытаться решить какие-либо проблемы со справедливостью.

Поскольку MinDiffModel предназначен для работы с большинством Keras Model классов, мы вынесена логику построения модели во вспомогательную функцию: get_uci_model .

Обучение с Pandas DataFrame

Это руководство тренирует скорость в течение одной эпохи, но может легко улучшить производительность модели, увеличив количество эпох.

model = tutorials_utils.get_uci_model()

model.compile(optimizer='adam', loss='binary_crossentropy')

df_without_target = train_df.drop(['target'], axis=1)  # Drop 'target' for x.
_ = model.fit(
    x=dict(df_without_target),  # The model expects a dictionary of features.
    y=train_df['target'],
    batch_size=128,
    epochs=1)
77/77 [==============================] - 3s 23ms/step - loss: 0.8589

Обучение с tf.data.Dataset

Эквивалентное обучение с tf.data.Dataset бы очень похоже (хотя инициализация и ввод случайность могут дать немного разные результаты).

model = tutorials_utils.get_uci_model()

model.compile(optimizer='adam', loss='binary_crossentropy')

_ = model.fit(
    tutorials_utils.df_to_dataset(train_df, batch_size=128),  # Converted to Dataset.
    epochs=1)
77/77 [==============================] - 3s 23ms/step - loss: 0.6416

Интеграция MinDiff для обучения

После подготовки данных примените MinDiff к своей модели, выполнив следующие действия:

  1. Создайте исходную модель, как без MinDiff.
original_model = tutorials_utils.get_uci_model()
  1. Заверните его в MinDiffModel .
min_diff_model = min_diff.keras.MinDiffModel(
    original_model=original_model,
    loss=min_diff.losses.MMDLoss(),
    loss_weight=1)
  1. Скомпилируйте его, как без MinDiff.
min_diff_model.compile(optimizer='adam', loss='binary_crossentropy')
  1. Поезд его с MinDiff набора данных ( train_with_min_diff_ds в данном случае).
_ = min_diff_model.fit(train_with_min_diff_ds, epochs=1)
77/77 [==============================] - 6s 31ms/step - loss: 0.7883 - min_diff_loss: 0.0379

Оценка и прогнозирование с помощью MinDiffModel

Обе оценки и прогнозирования с MinDiffModel подобны делать это с оригинальной моделью.

При вызове evaluate вы можете пройти в любом исходном массиве данных или один , содержащий данные MinDiff. Если вы выберете второй вариант , вы также получите min_diff_loss метрики в дополнении к любым другим метрикам измеряемой loss будут также включать в себя min_diff_loss .

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

  • Дополнительная метрика называется min_diff_loss будет присутствовать на выходе.
  • Значение loss метрики будет суммой первоначальной loss метрики (не показано на выходе) и min_diff_loss .
_ = min_diff_model.evaluate(
    tutorials_utils.df_to_dataset(train_df, batch_size=128))
# Calling with MinDiff data will include min_diff_loss in metrics.
_ = min_diff_model.evaluate(train_with_min_diff_ds)
77/77 [==============================] - 2s 22ms/step - loss: 0.4638
77/77 [==============================] - 3s 32ms/step - loss: 0.5087 - min_diff_loss: 0.0451

При вызове predict можно технически также передать в наборе данных с данными MinDiff , но она будет проигнорирована и не влияют на выход.

_ = min_diff_model.predict(
    tutorials_utils.df_to_dataset(train_df, batch_size=128))
_ = min_diff_model.predict(train_with_min_diff_ds)  # Identical to results above.

Ограничения использования MinDiffModel напрямую

При использовании MinDiffModel , как описано выше, большинство методов будут использовать реализацию по умолчанию tf.keras.Model (исключения , перечисленные в документации API ).

print('MinDiffModel.fit == keras.Model.fit')
print(min_diff.keras.MinDiffModel.fit == tf.keras.Model.fit)
print('MinDiffModel.train_step == keras.Model.train_step')
print(min_diff.keras.MinDiffModel.train_step == tf.keras.Model.train_step)
MinDiffModel.fit == keras.Model.fit
True
MinDiffModel.train_step == keras.Model.train_step
True

Для keras.Sequential или keras.Model , это прекрасно , так как они используют одни и те же функции.

print('Sequential.fit == keras.Model.fit')
print(tf.keras.Sequential.fit == tf.keras.Model.fit)
print('tf.keras.Sequential.train_step == keras.Model.train_step')
print(tf.keras.Sequential.train_step == tf.keras.Model.train_step)
Sequential.fit == keras.Model.fit
True
tf.keras.Sequential.train_step == keras.Model.train_step
True

Однако, если ваша модель является подклассом keras.Model , окружив его с MinDiffModel эффективно потерять настройки.

class CustomModel(tf.keras.Model):

  def train_step(self, **kwargs):
    pass  # Custom implementation.

print('CustomModel.train_step == keras.Model.train_step')
print(CustomModel.train_step == tf.keras.Model.train_step)
CustomModel.train_step == keras.Model.train_step
False

Если это ваш случай использования, вы не должны использовать MinDiffModel напрямую. Вместо этого вам нужно будет подкласс , как описано в руководстве настройки .

Дополнительные ресурсы