Integracja MinDiff z MinDiffModel

Wstęp

Istnieją dwa kroki, aby zintegrować MinDiff z twoim modelem:

  1. Przygotowanie danych (objętych w prowadnicy preparatu wejściowego ).

  2. Zmień lub stwórz model, który zintegruje MinDiff podczas treningu.

Podręcznik ten obejmie najprostszy sposób, aby zakończyć drugi krok: using MinDiffModel .

Ustawiać

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

Najpierw pobierz dane. Dla zwięzłości, logika przygotowanie wejścia zostały uwzględnione z pomocnikiem do funkcji opisanych w przewodniku przygotowania wejścia . Możesz przeczytać pełny przewodnik, aby uzyskać szczegółowe informacje na temat tego procesu.

# 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))

Oryginalny model

Podręcznik ten wykorzystuje podstawowe, niewyregulowanym keras.Model pomocą API Functional aby podświetlić za pomocą MinDiff. W rzeczywistej aplikacji należy starannie wybrać architekturę modelu i użyć strojenia, aby poprawić jakość modelu przed próbą rozwiązania jakichkolwiek problemów ze sprawiedliwością.

Od MinDiffModel został zaprojektowany do pracy z większością Keras Model klas, mamy zbitek logikę budowy modelu do funkcji pomocniczych: get_uci_model .

Trening z Pandas DataFrame

Ten przewodnik szkoli prędkość w jednej epoce, ale może łatwo poprawić wydajność modelu, zwiększając liczbę epok.

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

Szkolenie z tf.data.Dataset

Równoważnik szkolenia z tf.data.Dataset byłby bardzo podobny (chociaż inicjalizacji i losowości wejściowe mogą dawać nieco różne wyniki).

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

Integracja MinDiff do treningu

Po przygotowaniu danych zastosuj MinDiff do swojego modelu, wykonując następujące czynności:

  1. Utwórz oryginalny model tak, jak bez MinDiff.
original_model = tutorials_utils.get_uci_model()
  1. Owinąć go w MinDiffModel .
min_diff_model = min_diff.keras.MinDiffModel(
    original_model=original_model,
    loss=min_diff.losses.MMDLoss(),
    loss_weight=1)
  1. Skompiluj to tak, jak byś bez MinDiff.
min_diff_model.compile(optimizer='adam', loss='binary_crossentropy')
  1. Trenować go z zestawu danych MinDiff ( train_with_min_diff_ds w tym przypadku).
_ = min_diff_model.fit(train_with_min_diff_ds, epochs=1)
77/77 [==============================] - 6s 31ms/step - loss: 0.7883 - min_diff_loss: 0.0379

Ocena i przewidywanie z MinDiffModel

Zarówno oceny i przewidywania z MinDiffModel są podobne do robi tak z oryginalnego modelu.

Dzwoniąc evaluate można przejść w dowolnym oryginalnego zbioru danych lub jeden zawierający dane MinDiff. Jeśli wybierzesz to drugie, można również uzyskać min_diff_loss metryczny oprócz wszelkich innych wskaźników mierzonych loss będzie również obejmować min_diff_loss .

Dzwoniąc evaluate można przejść w dowolnym oryginalnego zbioru danych lub jeden zawierający dane MinDiff. Jeśli uwzględnisz MinDiff w wywołaniu do oceny, dwie rzeczy będą się różnić:

  • Dodatkowym metryczny nazywa min_diff_loss będzie obecny na wyjściu.
  • Wartość loss metryki będzie sumą pierwotnego loss danych (nie pokazany na wyjściu) i 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

Dzwoniąc predict można również przekazać technicznie w zbiorze danych z danymi MinDiff ale będzie ignorowane i nie wpływa na wydajność.

_ = 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.

Ograniczenia stosowania MinDiffModel bezpośrednio

W przypadku korzystania z MinDiffModel jak opisano powyżej, większość metod użyje implementacje domyślne tf.keras.Model (wyjątki podane w dokumentacji 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

Dla keras.Sequential lub keras.Model , to jest w porządku, ponieważ korzystają z tych samych funkcji.

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

Jednakże, jeśli twój model jest podklasą keras.Model , owijając go MinDiffModel skutecznie stracić dostosowywania.

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

Jeśli jest to Twój przypadek użycia, nie należy używać MinDiffModel bezpośrednio. Zamiast tego trzeba będzie rozszerzyć ją, jak to opisano w przewodniku dostosowywania .

Dodatkowe zasoby