序章
ほとんどの場合、使用MinDiffModel
直接ように記載ガイド「はMinDiffModelとMinDiffの統合」で十分です。ただし、カスタマイズされた動作が必要になる可能性があります。これの2つの主な理由は次のとおりです。
-
keras.Model
使用しているが、あなたが保存しておきたいというカスタム動作を持っています。 - あなたは欲しい
MinDiffModel
デフォルトとは異なる動作をします。
どちらの場合も、あなたはサブクラス化する必要があります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 Dataset for training, sampled at 0.3 for reduced runtimes.
train_df = tutorials_utils.get_uci_data(split='train', sample=0.3)
train_ds = tutorials_utils.df_to_dataset(train_df, batch_size=128)
# Dataset needed to train with MinDiff.
train_with_min_diff_ds = (
tutorials_utils.get_uci_with_min_diff_dataset(split='train', sample=0.3))
元のモデルのカスタマイズを維持する
tf.keras.Model
簡単に説明するようにサブクラスでカスタマイズできるように設計されてここに。あなたのモデルは、あなたがMinDiffを適用する際に保持したいの実装をカスタマイズしている場合は、サブクラス化する必要がありますMinDiffModel
。
オリジナルのカスタムモデル
あなたは、カスタマイズを維持するには、属性設定カスタムモデルを作成する方法を参照するにはTrue
のカスタムtrain_step
呼び出されます。これは便利なカスタマイズではありませんが、動作を説明するのに役立ちます。
class CustomModel(tf.keras.Model):
# Customized train_step
def train_step(self, *args, **kwargs):
self.used_custom_train_step = True # Marker that we can check for.
return super(CustomModel, self).train_step(*args, **kwargs)
そのようなAモデルをトレーニングすることは、通常と同じになりますSequential
モデル。
model = tutorials_utils.get_uci_model(model_class=CustomModel) # Use CustomModel.
model.compile(optimizer='adam', loss='binary_crossentropy')
_ = model.fit(train_ds.take(1), epochs=1, verbose=0)
# Model has used the custom train_step.
print('Model used the custom train_step:')
print(hasattr(model, 'used_custom_train_step')) # True
Model used the custom train_step: True
MinDiffModelのサブクラス化
あなたがしようと使用した場合MinDiffModel
直接、モデルはカスタム使用することはありませんtrain_step
。
model = tutorials_utils.get_uci_model(model_class=CustomModel)
model = min_diff.keras.MinDiffModel(model, min_diff.losses.MMDLoss())
model.compile(optimizer='adam', loss='binary_crossentropy')
_ = model.fit(train_with_min_diff_ds.take(1), epochs=1, verbose=0)
# Model has not used the custom train_step.
print('Model used the custom train_step:')
print(hasattr(model, 'used_custom_train_step')) # False
Model used the custom train_step: False
正しい使用するためにはtrain_step
方法を、あなたは両方のサブクラス化カスタムクラス必要MinDiffModel
とCustomModel
。
class CustomMinDiffModel(min_diff.keras.MinDiffModel, CustomModel):
pass # No need for any further implementation.
このモデルを訓練することに使用されますtrain_step
からCustomModel
。
model = tutorials_utils.get_uci_model(model_class=CustomModel)
model = CustomMinDiffModel(model, min_diff.losses.MMDLoss())
model.compile(optimizer='adam', loss='binary_crossentropy')
_ = model.fit(train_with_min_diff_ds.take(1), epochs=1, verbose=0)
# Model has used the custom train_step.
print('Model used the custom train_step:')
print(hasattr(model, 'used_custom_train_step')) # True
Model used the custom train_step: True
カスタマイズデフォルトの動作MinDiffModel
他の例では、特定のデフォルト動作変更することがありMinDiffModel
。この最も一般的なユースケースは、あなたが使用していない場合は、適切にあなたのデータを処理するために行動を開梱デフォルト変更さpack_min_diff_data
。
データをカスタム形式にパックすると、次のように表示される場合があります。
def _reformat_input(inputs, original_labels):
min_diff_data = min_diff.keras.utils.unpack_min_diff_data(inputs)
original_inputs = min_diff.keras.utils.unpack_original_inputs(inputs)
return ({
'min_diff_data': min_diff_data,
'original_inputs': original_inputs}, original_labels)
customized_train_with_min_diff_ds = train_with_min_diff_ds.map(_reformat_input)
customized_train_with_min_diff_ds
タプルからなるデータセットを返すバッチ(x, y)
x
含む辞書でmin_diff_data
とoriginal_inputs
およびy
あるoriginal_labels
。
for x, _ in customized_train_with_min_diff_ds.take(1):
print('Type of x:', type(x)) # dict
print('Keys of x:', x.keys()) # 'min_diff_data', 'original_inputs'
Type of x: <class 'dict'> Keys of x: dict_keys(['min_diff_data', 'original_inputs'])
このデータフォーマットはものではありませんMinDiffModel
デフォルトでは期待し渡しcustomized_train_with_min_diff_ds
それにすると、予期しない動作が発生するでしょう。これを修正するには、独自のサブクラスを作成する必要があります。
class CustomUnpackingMinDiffModel(min_diff.keras.MinDiffModel):
def unpack_min_diff_data(self, inputs):
return inputs['min_diff_data']
def unpack_original_inputs(self, inputs):
return inputs['original_inputs']
このサブクラスを使用すると、他の例と同様にトレーニングできます。
model = tutorials_utils.get_uci_model()
model = CustomUnpackingMinDiffModel(model, min_diff.losses.MMDLoss())
model.compile(optimizer='adam', loss='binary_crossentropy')
_ = model.fit(customized_train_with_min_diff_ds, epochs=1)
77/77 [==============================] - 4s 30ms/step - loss: 0.6690 - min_diff_loss: 0.0395
カスタマイズの制限事項MinDiffModel
カスタム作成MinDiffModel
、より複雑なユースケースのための柔軟性の膨大な量を提供します。ただし、サポートされないエッジケースがまだいくつかあります。
前の入力の前処理または検証call
サブクラスの最大の制限MinDiffModel
それが必要とすることでx
入力データの成分(によって返されたバッチで、すなわち最初のまたは唯一の要素tf.data.Dataset
する前処理または検証なしに通しする) call
。
これは単にmin_diff_data
中に充填されたx
入力データの構成要素。任意の前処理や検証が含む追加の構造期待しないだろうmin_diff_data
、おそらく解除されます。
前処理または検証が簡単にカスタマイズ可能である場合(たとえば、独自のメソッドに組み込まれている場合)、追加の構造を正しく処理するようにオーバーライドすることで、これに簡単に対処できます。
検証の例は次のようになります。
class CustomMinDiffModel(min_diff.keras.MinDiffModel, CustomModel):
# Override so that it correctly handles additional `min_diff_data`.
def validate_inputs(self, inputs):
original_inputs = self.unpack_original_inputs(inputs)
... # Optionally also validate min_diff_data
# Call original validate method with correct inputs
return super(CustomMinDiffModel, self).validate(original_inputs)
前処理や検証が簡単にカスタマイズし、使用していない場合はMinDiffModel
動作しない場合があります、あなたはで説明したようにそれなしMinDiffを統合する必要がありますため、このガイド。
メソッド名の衝突
あなたのモデルが名前に実装されたものと衝突する方法があることも可能であるMinDiffModel
(で公開メソッドの完全なリストを参照してくださいAPIドキュメントを)。
これは、これらがモデルのインスタンスで呼び出される場合にのみ問題になります(他のメソッドで内部的に呼び出されるのではありません)。あなたはこのような状況にある場合に非常に低いが、あなたは可能ではない場合、あなたはなしMinDiffの統合を検討する必要がある場合があり、どちらかのオーバーライドを持っており、いくつかのメソッドの名前を変更したりしますMinDiffModel
で説明したように、件名にこのガイド。
追加リソース
- 公平性評価の深さでの議論を参照の公正性指標のガイダンスを
- 修復とMinDiffに関する一般的な情報については、修復の概要を。
- MinDiffが見る周囲の要件の詳細については、このガイドを。
- KerasでMinDiffを使用して、エンドツーエンドのチュートリアルを参照するには、参照このチュートリアルを。