web-dev-qa-db-fra.com

Comment désactiver le décrochage lors de la prédiction en keras?

J'utilise l'abandon dans le modèle de réseau neuronal en keras. Le petit code est comme

model.add(Dropout(0.5))
model.add(Dense(classes))

Pour les tests, j'utilise preds = model_1.predict_proba(image).

Mais en testant Dropout participe également à prédire le score qui ne devrait pas se produire. Je recherche beaucoup pour désactiver le décrochage, mais je n'ai pas encore obtenu d'indication.

Quelqu'un at-il une solution pour désactiver le Dropout lors des tests en keras ??

14
Akhilesh

Keras le fait par défaut. Dans Keras, le décrochage est désactivé en mode test. Vous pouvez regarder le code ici et voir qu'ils utilisent l'entrée supprimée lors de la formation et l'entrée réelle lors du test.

Autant que je sache, vous devez créer votre propre fonction de formation à partir des couches et spécifier le drapeau de formation à prédire avec abandon (par exemple, il n'est pas possible de spécifier un drapeau de formation pour les fonctions de prévision). C'est un problème dans le cas où vous souhaitez effectuer des GAN, qui utilisent la sortie intermédiaire pour la formation et entraînent également le réseau dans son ensemble, en raison d'une divergence entre les images de formation générées et les images de test générées.

27
Thomas Pinetz

Comme indiqué précédemment, le décrochage à Keras ne se produit qu'au moment du train (avec un ajustement proportionnel du poids pendant la formation de sorte que les poids appris sont appropriés pour la prédiction lorsque le décrochage est désactivé).

Ce n'est pas idéal dans les cas où nous souhaitons utiliser un NNET d'abandon comme prédicteur probabiliste (de sorte qu'il produit une distribution lorsqu'on lui demande de prédire les mêmes entrées à plusieurs reprises). En d'autres termes, la couche Dropout de Keras est conçue pour vous donner une régularisation au moment du train, mais la "fonction moyenne" de la distribution apprise lors de la prévision.

Si vous souhaitez conserver l'abandon pour la prédiction, vous pouvez facilement implémenter une couche d'abandon permanent ("PermaDropout") (cela était basé sur les suggestions faites par F. Chollet sur le Zone de discussion GitHub pour Keras ):

from keras.layers.core import Lambda
from keras import backend as K

def PermaDropout(rate):
    return Lambda(lambda x: K.dropout(x, level=rate))

En remplaçant n'importe quelle couche d'abandon dans un modèle Keras par "PermaDropout", vous obtiendrez également le comportement probabiliste dans la prédiction.

# define the LSTM model
n_vocab = text_to_train.n_vocab

model = Sequential()
model.add(LSTM(n_vocab*4, 
          input_shape=input_shape, 
          return_sequences=True))
# Replace Dropout with PermaDropout
# model.add(Dropout(0.3)
model.add(PermaDropout(0.3))
model.add(LSTM(n_vocab*2))
# Replace Dropout with PermaDropout
# model.add(Dropout(0.3)
model.add(PermaDropout(0.3))
#model.add(Dense(n_vocab*2))
model.add(Dense(n_vocab, activation='softmax'))
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
8
T3am5hark

Le décrochage supprime certains neurones sous forme de jeu, et pour compenser cela, nous prenons généralement l'une des deux façons.

  1. mise à l'échelle de l'activation au moment du test
  2. inverser le décrochage pendant la phase de formation

Et keras utilise la deuxième forme de correction comme vous pouvez le voir ici

2
Vj-

Vous pouvez modifier le décrochage dans un modèle entraîné (avec des calques de décrochage):

f = K.function([model.layers[0].input, K.learning_phase()], [model.layers[-1].output])

De cette façon, vous n'avez pas à réentraîner le modèle !!!

1
Marco Cerliani