TensorFlow.org'da görüntüleyin | Google Colab'da çalıştırın | Kaynağı GitHub'da görüntüleyin | Not defterini indir |
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 .