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 ??
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.
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'])
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.
Et keras utilise la deuxième forme de correction comme vous pouvez le voir ici
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 !!!