introduction
Dans la plupart des cas, en utilisant MinDiffModel
directement comme décrit dans le manuel « L' intégration mindiff avec MinDiffModel » suffit. Cependant, il est possible que vous ayez besoin d'un comportement personnalisé. Les deux principales raisons à cela sont :
- Le
keras.Model
que vous utilisez a un comportement personnalisé que vous souhaitez conserver. - Vous voulez que le
MinDiffModel
se comporter différemment de la valeur par défaut.
Dans les deux cas, vous devez la sous - MinDiffModel
pour obtenir les résultats souhaités.
Installer
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
Tout d'abord, téléchargez les données. Pour la concision, la logique de préparation d'entrée a été pris en compte dans des fonctions auxiliaires , comme décrit dans le guide de préparation d'entrée . Vous pouvez lire le guide complet pour plus de détails sur ce processus.
# 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))
Préservation des personnalisations du modèle d'origine
tf.keras.Model
est conçu pour être facilement personnalisé via le sous - classement comme décrit ici . Si votre modèle a personnalisé implémentations que vous souhaitez conserver lors de l' application mindiff, vous aurez besoin de sous - classe MinDiffModel
.
Modèle personnalisé d'origine
Pour voir comment vous pouvez conserver les personnalisations, créez un modèle personnalisé qui définit un attribut à True
lorsque sa coutume train_step
est appelée. Ce n'est pas une personnalisation utile mais servira à illustrer le comportement.
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)
La formation d' un tel modèle serait le même aspect que la normale Sequential
modèle.
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
Sous-classement MinDiffModel
Si vous deviez essayer d'utiliser MinDiffModel
directement, le modèle ne serait pas utiliser la coutume 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
Pour utiliser la bonne train_step
méthode, vous avez besoin d' une classe personnalisée qui sous - classe à la fois MinDiffModel
et CustomModel
.
class CustomMinDiffModel(min_diff.keras.MinDiffModel, CustomModel):
pass # No need for any further implementation.
La formation de ce modèle utilisera la train_step
de 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
Personnalisation des comportements par défaut de MinDiffModel
Dans d' autres cas, vous pouvez modifier les comportements par défaut spécifiques de MinDiffModel
. Le cas le plus d'usage courant est en train de changer le comportement par défaut de déballer pour gérer correctement vos données si vous n'utilisez pas pack_min_diff_data
.
Lors de l'emballage des données dans un format personnalisé, cela peut apparaître comme suit.
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)
Les customized_train_with_min_diff_ds
ensemble de données renvoie les lots composés de tuples (x, y)
où x
est un dict contenant min_diff_data
et original_inputs
et y
est le 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'])
Ce format de données ne sont pas ce que MinDiffModel
attend par défaut et en passant customized_train_with_min_diff_ds
à elle entraînerait un comportement inattendu. Pour résoudre ce problème, vous devrez créer votre propre sous-classe.
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']
Avec cette sous-classe, vous pouvez vous entraîner comme avec les autres exemples.
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
Limites d'un sur mesure MinDiffModel
Création d' une coutume MinDiffModel
offre une énorme quantité de flexibilité pour les cas d'utilisation plus complexes. Cependant, il existe encore des cas extrêmes qu'il ne prendra pas en charge.
Prétraiter ou de validation des entrées avant l' call
La plus grande limitation pour une sous - classe de MinDiffModel
est qu'il nécessite le x
composant des données d'entrée ( à savoir l'élément premier ou seulement dans la charge renvoyée par le tf.data.Dataset
) pour passer à travers sans pré - traitement ou de validation d' call
.
Ceci est simplement parce que le min_diff_data
est emballé dans le x
composant des données d'entrée. Toute pré - traitement ou de validation ne seront pas attendre la structure supplémentaire contenant min_diff_data
et sera probablement briser.
Si le prétraitement ou la validation est facilement personnalisable (par exemple, pris en compte dans sa propre méthode), alors cela est facilement résolu en le remplaçant pour s'assurer qu'il gère correctement la structure supplémentaire.
Un exemple avec validation pourrait ressembler à ceci :
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)
Si le pré - traitement ou de validation ne sont pas facilement personnalisable, puis en utilisant MinDiffModel
peut ne pas fonctionner pour vous et vous aurez besoin d'intégrer mindiff sans comme décrit dans ce guide .
Collisions de nom de méthode
Il est possible que votre modèle a des méthodes dont les noms en conflit avec celles mises en œuvre dans MinDiffModel
(voir la liste complète des méthodes publiques dans la documentation de l' API ).
Cela n'est problématique que si ceux-ci sont appelés sur une instance du modèle (plutôt qu'en interne dans une autre méthode). Bien que très improbable, si vous êtes dans cette situation , vous devez soit prioritaire et renommer certaines méthodes ou, à défaut, vous devrez peut - être envisager d' intégrer mindiff sans MinDiffModel
comme décrit dans ce guide sur le sujet .
Ressources additionnelles
- Pour une discussion approfondie sur l' évaluation de l' équité voir les conseils indicateurs d' équité
- Pour des informations générales sur l' assainissement et mindiff, consultez la liste de remise en état .
- Pour plus de détails sur les exigences entourant mindiff voir ce guide .
- Pour voir un tutoriel de bout en bout sur l' utilisation mindiff dans Keras, consultez ce tutoriel .