소개
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으로 훈련하기
이 가이드는 속도를 위해 단일 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를 모델에 적용합니다.
- MinDiff 없이 원래 모델을 생성합니다.
original_model = tutorials_utils.get_uci_model()
- A의 그것을 감싸
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
직접. 대신에 설명 된대로 하위 클래스해야합니다 사용자 정의 가이드 .