MinDiffModel 사용자 지정

소개

대부분의 경우 "MinDiff를 MinDiffModel과 통합"가이드에 설명 된대로 MinDiffModel 직접 사용하는 것으로 충분합니다. 그러나 사용자 지정 동작이 필요할 수 있습니다. 이에 대한 두 가지 주요 이유는 다음과 같습니다.

  • 사용 keras.Model 에는 보존하려는 사용자 지정 동작이 있습니다.
  • MinDiffModel 이 기본값과 다르게 동작하기를 원합니다.

두 경우 모두 원하는 결과를 얻으려면 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의 하위 클래스를 MinDiffModel 합니다.

오리지널 커스텀 모델

사용자 지정을 유지하는 방법을 보려면 사용자 지정 train_step 이 호출 될 때 속성을 True 설정하는 사용자 지정 모델을 만듭니다. 이것은 유용한 사용자 정의는 아니지만 동작을 설명하는 데 도움이됩니다.

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)

이러한 모델을 훈련하는 것은 일반 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 할 때는 CustomModeltrain_step 을 사용합니다.

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 사용하지 않는 경우 데이터를 올바르게 처리하기 위해 기본 압축 해제 동작을 변경하는 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) 로 구성된 배치를 반환합니다. 여기서 xmin_diff_dataoriginal_inputs 포함하는 dict이고 yoriginal_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 의해 반환 된 배치의 첫 번째 또는 유일한 요소)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 설명서 의 전체 공용 메서드 목록 참조).

이것은 모델의 인스턴스에서 호출되는 경우에만 문제가됩니다 (다른 메서드에서 내부적으로가 아니라). 가능성은 매우 낮지 만이 상황에있는 경우 일부 메서드를 재정의하고 이름을 변경해야하거나 가능하지 않은 경우 주제에 대한이 가이드에 설명 된대로 MinDiffModel없이 MinDiffModel 통합을 고려해야 할 수 있습니다.

추가 자료

  • 공정성 평가에 대한 심층 토론은 공정성 지표 지침을 참조하십시오.
  • 수정 및 MinDiff에 대한 일반 정보는 수정 개요를 참조하십시오.
  • MinDiff와 관련된 요구 사항에 대한 자세한 내용은 이 가이드를 참조하십시오.
  • Keras에서 MinDiff를 사용하는 방법에 대한 종단 간 자습서를 보려면 이 자습서를 참조하십시오.