web-dev-qa-db-fra.com

Fonction de perte personnalisée Keras: accès au modèle d'entrée actuel

Dans Keras (avec backend Tensorflow), le modèle d'entrée actuel est-il disponible pour ma fonction de perte personnalisée?

Le motif d'entrée actuel est défini comme le vecteur d'entrée utilisé pour produire la prédiction. Par exemple, considérez les éléments suivants: X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, random_state=42, shuffle=False). Ensuite, le motif d'entrée actuel est le vecteur X_train actuel associé au y_train (qui est appelé y_true dans la fonction de perte).

Lors de la conception d'une fonction de perte personnalisée, j'ai l'intention d'optimiser/minimiser une valeur qui nécessite l'accès au modèle d'entrée actuel, et pas seulement à la prédiction actuelle.

J'ai jeté un œil à travers https://github.com/fchollet/keras/blob/master/keras/losses.py

J'ai aussi regardé " Fonction de coût qui n'est pas seulement y_pred, y_true? "

Je connais également les exemples précédents pour produire une fonction de perte personnalisée:

import keras.backend as K

def customLoss(y_true,y_pred):
    return K.sum(K.log(y_true) - K.log(y_pred))

Vraisemblablement (y_true,y_pred) sont définis ailleurs. J'ai jeté un œil au code source sans succès et je me demande si je dois définir moi-même le modèle d'entrée actuel ou s'il est déjà accessible à ma fonction de perte.

15
jtromans

Vous pouvez encapsuler la fonction de perte en tant que fonction interne et lui passer votre tenseur d'entrée (comme cela se fait couramment lors du passage d'arguments supplémentaires à la fonction de perte).

def custom_loss_wrapper(input_tensor):
    def custom_loss(y_true, y_pred):
        return K.binary_crossentropy(y_true, y_pred) + K.mean(input_tensor)
    return custom_loss

input_tensor = Input(shape=(10,))
hidden = Dense(100, activation='relu')(input_tensor)
out = Dense(1, activation='sigmoid')(hidden)
model = Model(input_tensor, out)
model.compile(loss=custom_loss_wrapper(input_tensor), optimizer='adam')

Vous pouvez vérifier que input_tensor Et la valeur de la perte (principalement, la partie K.mean(input_tensor)) changeront lorsque différents X seront transmis au modèle.

X = np.random.Rand(1000, 10)
y = np.random.randint(2, size=1000)
model.test_on_batch(X, y)  # => 1.1974642

X *= 1000
model.test_on_batch(X, y)  # => 511.15466
23
Yu-Yang