machine learning - metrologia - ¿Cómo calcular la incertidumbre de predicción usando Keras?
como calcular la incertidumbre de la velocidad (2)
Me gustaría calcular la certeza / confianza del modelo NN (ver Lo que mi modelo profundo no sabe ) - cuando NN me dice que una imagen representa "8", me gustaría saber qué tan cierto es. ¿Mi modelo tiene un 99% de certeza de que es "8" o es un 51% de "8", pero también podría ser "6"? Algunos dígitos son bastante ambiguos y me gustaría saber para qué imágenes el modelo simplemente está "arrojando una moneda".
He encontrado algunos escritos teóricos sobre esto, pero tengo problemas para poner esto en el código. Si lo entiendo correctamente, debería evaluar una imagen de prueba varias veces mientras "mato" a las diferentes neuronas (usando la deserción) y luego ...?
Trabajando en el conjunto de datos MNIST, estoy ejecutando un siguiente modelo:
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,))
Pregunta: ¿cómo debo predecir con este modelo para que también tenga certeza sobre las predicciones? Agradecería algún ejemplo práctico (preferiblemente en Keras, pero cualquiera lo hará).
EDITAR : para aclarar, estoy buscando, por ejemplo, cómo obtener certeza utilizando el método descrito por Yurin Gal (o una explicación de por qué algún otro método produce mejores resultados).
Si desea implementar el método de abandono para medir la incertidumbre, debe hacer lo siguiente:
Implemente la función que aplica el abandono también durante el tiempo de prueba:
import keras.backend as K f = K.function([model.layers[0].input, K.learning_phase()], [model.layers[-1].output])
Utilice esta función como predictor de incertidumbre, por ejemplo, de la siguiente manera:
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
Por supuesto, puede usar cualquier función diferente para calcular la incertidumbre.
Su modelo usa una activación de softmax, por lo que la forma más sencilla de obtener algún tipo de medida de incertidumbre es observar las probabilidades de softmax de salida:
probs = model.predict(some input data)[0]
La matriz de probs
será entonces un vector de números de 10 elementos en el rango [0, 1] que suma a 1.0, por lo que se pueden interpretar como probabilidades. Por ejemplo, la probabilidad del dígito 7 es solo probs[7]
.
Luego, con esta información puede hacer un procesamiento posterior, generalmente la clase predicha es la que tiene la probabilidad más alta, pero también puede ver la clase con la segunda probabilidad más alta, etc.