MinDiffModelのカスタマイズ

序章

ほとんどの場合、使用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方法を、あなたは両方のサブクラス化カスタムクラス必要MinDiffModelCustomModel

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_dataoriginal_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で説明したように、件名にこのガイド

追加リソース