序章
MinDiffをモデルに統合するには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
。
PandasDataFrameを使用したトレーニング
このガイドは、速度について単一のエポックをトレーニングしますが、エポックの数を増やすことでモデルのパフォーマンスを簡単に向上させることができます。
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データを含む1のいずれかに渡すことができます。あなたは後者を選択した場合は、取得しますmin_diff_loss
測定されている任意の他のメトリックに加えて、メトリックをloss
も含まれますmin_diff_loss
。
呼び出すときにevaluate
あなたは、元のデータセットまたはMinDiffデータを含む1のいずれかに渡すことができます。評価の呼び出しにMinDiffを含めると、2つの点が異なります。
- 追加のメトリックは、呼び出された
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
直接。代わりに、あなたはで説明したように、それをサブクラス化する必要がありますカスタマイズガイド。
追加リソース
- 公平性評価の深さでの議論を参照の公正性指標のガイダンスを
- 修復とMinDiffに関する一般的な情報については、修復の概要を。
- MinDiffが見る周囲の要件の詳細については、このガイドを。
- KerasでMinDiffを使用して、エンドツーエンドのチュートリアルを参照するには、参照このチュートリアルを。