42 votes

Comment calculer l'incertitude de prévision à l'aide de Keras?

Je voudrais calculer NN modèle de certitude / confiance (voir Ce que mon modèle de profondeur ne sais pas) - lorsque NN raconte-moi une image représente "8", je voudrais savoir comment il est certain. Mon modèle est certain à 99% qu'il est "8" ou est-il de 51% c'est: "8", mais il pourrait aussi être "6"? Certains chiffres sont tout à fait ambiguë et je voudrais savoir pour qui images le modèle est juste de la "pile ou face".

J'ai trouvé quelques écrits théoriques à ce sujet, mais j'ai de la difficulté à insérer dans le code. Si je comprends bien, je dois évaluer un test de l'image à plusieurs reprises tout en "tuant" les neurones différents (à l'aide d'abandon) et puis...?

Travail sur MNIST dataset, je suis en cours d'exécution d'un modèle suivant:

from keras.models import Sequential
from keras.layers import Dense, Activation, Conv2D, Flatten, Dropout

model = Sequential()
model.add(Conv2D(128, kernel_size=(7, 7),
                 activation='relu',
                 input_shape=(28, 28, 1,)))
model.add(Dropout(0.20))
model.add(Conv2D(64, (3, 3), activation='relu'))
model.add(Dropout(0.20))
model.add(Flatten())
model.add(Dense(units=64, activation='relu'))
model.add(Dropout(0.25))
model.add(Dense(units=10, activation='softmax'))
model.summary()
model.compile(loss='categorical_crossentropy',
              optimizer='sgd',
              metrics=['accuracy'])
model.fit(train_data, train_labels,  batch_size=100, epochs=30, validation_data=(test_data, test_labels,))

Question: comment dois-je prévoir avec ce modèle, afin que je reçois de sa certitude sur les prédictions trop? Je vous serais reconnaissant de quelques exemples pratiques (de préférence dans Keras, mais tout ce qu'il fera).

EDIT: pour préciser, je suis à la recherche d'exemple de la façon d'obtenir la certitude à l'aide de la méthode décrite par Yurin Gal (ou une explication pourquoi une autre méthode donne de meilleurs résultats).

31voto

Marcin Możejko Points 19602

Si vous souhaitez mettre en œuvre une approche d' abandon pour mesurer l'incertitude, procédez comme suit:

  1. Fonction implémenter qui applique les abandons également pendant la période de test

     import keras.backend as K
    f = K.function([model.layers[0].input, K.learning_phase()],
                   [model.layers[-1].output])
     
  2. Utilisez cette fonction comme prédicteur d'incertitude, par exemple de la manière suivante:

     def predict_with_uncertainty(f, x, n_iter=10):
        result = numpy.zeros((n_iter,) + x.shape)
    
        for iter in range(n_iter):
            result[iter] = f(x, 1)
    
        prediction = result.mean(axis=0)
        uncertainty = result.var(axis=0)
        return prediction, uncertainty
     

Bien sûr, vous pouvez utiliser n'importe quelle fonction différente pour calculer l'incertitude.

6voto

Chexn Points 21

Apporté quelques modifications à la réponse la plus votée. Maintenant cela fonctionne pour moi.

C'est un moyen d'estimer l'incertitude du modèle. Pour d’autres sources d’incertitude, j’ai trouvé https://eng.uber.com/neural-networks-uncertainty-estimation/ utile.

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


def predict_with_uncertainty(f, x, n_iter=10):
    result = []

    for i in range(n_iter):
        result.append(f([x, 1]))

    result = np.array(result)

    prediction = result.mean(axis=0)
    uncertainty = result.var(axis=0)
    return prediction, uncertainty
 

3voto

abagshaw Points 2081

Une méthode plus simple consiste à définir training=True sur toutes les couches abandonnées que vous souhaitez exécuter pendant l'inférence (indique essentiellement que la couche doit fonctionner comme si elle était toujours en mode entraînement - elle est donc toujours présente pour l'entraînement et l'inférence. ).

 import keras

inputs = keras.Input(shape=(10,))
x = keras.layers.Dense(3)(inputs)
outputs = keras.layers.Dropout(0.5)(x, training=True)

model = keras.Model(inputs, outputs)
 

Le code ci-dessus provient de ce problème .

2voto

Matias Valdenegro Points 16473

Votre modèle utilise un softmax d'activation, de sorte que la façon la plus simple d'obtenir une certaine forme de mesure de l'incertitude est à chercher à la sortie softmax probabilités:

probs = model.predict(some input data)[0]

L' probs tableau sera ensuite 10 élément de vecteur de nombres dans [0, 1], la gamme d'un montant de 1,0, de sorte qu'ils peuvent être interprétés comme des probabilités. Par exemple, la probabilité pour que le chiffre 7 est juste probs[7].

Alors avec cette information, vous pouvez faire un peu de post-traitement, généralement le prédit de classe est la probabilité la plus élevée, mais vous pouvez aussi regarder à la classe de la deuxième plus grande probabilité, etc.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X