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으로 훈련하기

이 가이드는 속도를 위해 단일 Epoch에 대해 학습하지만 Epoch 수를 늘려 모델의 성능을 쉽게 향상시킬 수 있습니다.

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

A를 동등한 교육 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. A의 그것을 감싸 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 직접. 대신에 설명 된대로 하위 클래스해야합니다 사용자 정의 가이드 .

추가 리소스