MinDiffModel'i Özelleştirme

Tanıtım

Çoğu durumda, kullanarak MinDiffModel doğrudan olarak açıklanan kılavuz "MinDiffModel ile MinDiff entegre" yeterlidir. Ancak, özelleştirilmiş davranışa ihtiyacınız olabilir. Bunun başlıca iki nedeni şunlardır:

  • keras.Model kullandığınız korumak istediğiniz o özel davranışı vardır.
  • Sen istiyorsun MinDiffModel varsayılan farklı davranmaya.

Her iki durumda da, alt sınıfı gerekir MinDiffModel istenen sonuçları elde etmek.

Kurmak

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

İlk önce verileri indirin. Açıklandığı gibi özlülük için, giriş hazırlığı mantık YardımcıFonksiyonlar içine çarpanlarına girdi hazırlığı rehberi . Bu işlemle ilgili ayrıntılar için kılavuzun tamamını okuyabilirsiniz.

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

Orijinal Model Özelleştirmelerini Koruma

tf.keras.Model kolayca açıklandığı gibi sınıflara yoluyla özelleştirilmiş olması için tasarlanmıştır burada . Modeliniz MinDiff uygularken korumak isteyen uygulamalar özelleştirilmiş verdiyse, alt sınıfı gerekir MinDiffModel .

Orijinal Özel Model

Eğer özelleştirmeleri korumak için bir öznitelik ayarlar Özel bir model oluşturmak nasıl görmek için True onun özel train_step denir. Bu yararlı bir özelleştirme değildir, ancak davranışı göstermeye hizmet edecektir.

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)

Böyle bir model eğitmek normal aynı olmazdı Sequential modeli.

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

Alt Sınıflandırma MinDiffModel

Eğer denemek ve kullanmak olsaydı MinDiffModel doğrudan model özel kullanmak ister 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

Doğru kullanmak için train_step yöntemi, her iki alt sınıfların özel bir sınıf ihtiyacımız MinDiffModel ve CustomModel .

class CustomMinDiffModel(min_diff.keras.MinDiffModel, CustomModel):
  pass  # No need for any further implementation.

Bu modeli Eğitim kullanacağı train_step gelen 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

Arasında Özelleştirme varsayılan davranışları MinDiffModel

Diğer durumlarda, belirli varsayılan davranışları değiştirmek isteyebilirsiniz MinDiffModel . Bunun en yaygın kullanım şeklidir kullanmak yoksa düzgün veri işlemek için varsayılan açma davranışı değişiyor pack_min_diff_data .

Verileri özel bir biçimde paketlerken, bu aşağıdaki gibi görünebilir.

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 dizilerini oluşan veri kümesi döner toplu (x, y) x içeren dict olan min_diff_data ve original_inputs ve y olan 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'])

Bu veri formatı ne değildir MinDiffModel varsayılan olarak beklediğini ve geçen customized_train_with_min_diff_ds kendisine beklenmedik davranışlara neden olur. Bunu düzeltmek için kendi alt sınıfınızı oluşturmanız gerekir.

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']

Bu alt sınıf ile diğer örneklerde olduğu gibi eğitim verebilirsiniz.

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

Özelleştirilmiş sınırlamaları MinDiffModel

Özel bir oluşturma MinDiffModel daha karmaşık kullanım durumları için esneklik büyük miktarda sağlar. Ancak, hala desteklemeyeceği bazı uç durumlar var.

Önce girdilerin Ön işleme veya Doğrulama call

Bir alt sınıfında en büyük sınırlama MinDiffModel bu gerektirmesidir x (yani dönen toplu ilk veya tek eleman, giriş veri bileşeni tf.data.Dataset ön işleme ya da doğrulama olmadan) içinden geçmesi için call .

Nedeni basitçe min_diff_data içine paketlendi x giriş verilerinin bileşeni. Herhangi ön işleme ya da doğrulama içeren ek yapıyı beklemek olmaz min_diff_data ve büyük olasılıkla kıracak.

Ön işleme veya doğrulama kolayca özelleştirilebilirse (örneğin kendi yöntemine dahil edilirse), ek yapıyı doğru şekilde işlemesini sağlamak için geçersiz kılarak bu kolayca giderilir.

Doğrulama içeren bir örnek şöyle görünebilir:

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)

Ön işleme ya da doğrulama kolayca özelleştirilebilir, o zaman kullanarak değilse MinDiffModel çalışma olmayabilir Hem siz açıklandığı gibi onsuz MinDiff entegre etmek gerekir için bu kılavuzun .

Yöntem adı çakışmaları

Sizin modeli isimleri kullanılanların çatışma yöntemleri vardır mümkündür MinDiffModel (kamu yöntemlerin tam listesini görmek API belgeleri ).

Bu, yalnızca bunlar modelin bir örneğinde çağrılacaksa sorunludur (başka bir yöntemde dahili olarak değil). Bu durumda ise pek olası olsa da, mümkün olmadığı takdirde, sen olmadan MinDiff entegre dikkate almak gerekebilir, ya geçersiz kılma zorunda ve bazı yöntemler yeniden adlandırmak veya olacaktır MinDiffModel açıklandığı gibi konuyla ilgili bu kılavuzda .

Ek kaynaklar

  • Adalet değerlendirmeye derin tartışmalara için bkz Adil Göstergeler rehberlik
  • İyileştirme ve MinDiff hakkında genel bilgi için, bkz düzeltme bakış .
  • MinDiff çevreleyen gereksinimleri hakkında ayrıntılı bilgi için bkz bu kılavuzu .
  • Keras içinde MinDiff kullanma konusunda uçtan uca öğretici görmek için bkz bu öğretici .