Посмотреть на TensorFlow.org | Запустить в Google Colab | Посмотреть исходный код на GitHub | Скачать блокнот |
Введение
Есть два шага для интеграции MinDiff в вашу модель:
Подготовьте данные (покрытые в руководстве подготовки ввода ).
Измените или создайте модель, которая будет интегрировать 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 к своей модели, выполнив следующие действия:
- Создайте исходную модель, как без MinDiff.
original_model = tutorials_utils.get_uci_model()
- Заверните его в
MinDiffModel
.
min_diff_model = min_diff.keras.MinDiffModel(
original_model=original_model,
loss=min_diff.losses.MMDLoss(),
loss_weight=1)
- Скомпилируйте его, как без MinDiff.
min_diff_model.compile(optimizer='adam', loss='binary_crossentropy')
- Поезд его с 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
напрямую. Вместо этого вам нужно будет подкласс , как описано в руководстве настройки .
Дополнительные ресурсы
- Для того углубленного обсуждения по оценке справедливости см руководство Справедливость Indicators
- Для получения общей информации о реабилитации и MinDiff см обзор исправления .
- Для получения дополнительной информации о требованиях окружающих MinDiff см это руководство .
- Чтобы увидеть учебник конца в конец по использованию MinDiff в Keras см этого учебника .