Wstęp
Istnieją dwa kroki, aby zintegrować MinDiff z twoim modelem:
Przygotowanie danych (objętych w prowadnicy preparatu wejściowego ).
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:
- Utwórz oryginalny model tak, jak bez MinDiff.
original_model = tutorials_utils.get_uci_model()
- Owinąć go w
MinDiffModel.
min_diff_model = min_diff.keras.MinDiffModel(
original_model=original_model,
loss=min_diff.losses.MMDLoss(),
loss_weight=1)
- Skompiluj to tak, jak byś bez MinDiff.
min_diff_model.compile(optimizer='adam', loss='binary_crossentropy')
- Trenować go z zestawu danych MinDiff (
train_with_min_diff_dsw 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_lossbędzie obecny na wyjściu. - Wartość
lossmetryki będzie sumą pierwotnegolossdanych (nie pokazany na wyjściu) imin_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
- Dla dogłębnej dyskusji na temat oceny rzetelności patrz wytyczne Fairness Indicators
- Aby uzyskać ogólne informacje na naprawę i MinDiff, zobacz przegląd naprawcze .
- Szczegółowe informacje na temat wymagań otaczających MinDiff zobaczyć ten podręcznik .
- Aby zobaczyć samouczek end-to-end na wykorzystaniu MinDiff w Keras, zobacz ten samouczek .
Zobacz na TensorFlow.org
Uruchom w Google Colab
Wyświetl źródło na GitHub
Pobierz notatnik