MinDiff 모델 커스터마이징

소개

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

  • 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)

이러한 모델을 훈련하는 것은 보통 같은 보일 것이다 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_inputsy 은 IS 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 에 설명 된대로 주제에이 가이드 .

추가 리소스