MinDiffとMinDiffModelの統合

序章

MinDiffをモデルに統合するには2つのステップがあります。

  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

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をモデルに適用します。

  1. MinDiffを使用しない場合と同じように、元のモデルを作成します。
original_model = tutorials_utils.get_uci_model()
  1. で包み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データを含む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直接。代わりに、あなたはで説明したように、それをサブクラス化する必要がありますカスタマイズガイド

追加リソース