如何使用 Keras 计算预测不确定性?
How to calculate prediction uncertainty using Keras?
我想计算 NN 模型 certainty/confidence(参见 What my deep model doesn't know)- 当 NN 告诉我一个图像代表“8”时,我想知道它有多确定。我的模型是 99% 确定它是“8”还是 51% 确定它是“8”,但也可能是“6”?有些数字非常模糊,我想知道模型只是 "flipping a coin".
的哪些图像
我找到了一些关于此的理论著作,但我无法将其写入代码。如果我理解正确,我应该多次评估测试图像,同时 "killing off" 不同的神经元(使用 dropout)然后......?
在 MNIST 数据集上工作,我是运行以下模型:
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,))
我应该如何使用此模型进行预测,以便我也能确定其预测结果?我希望能提供一些实际示例(最好是在 Keras 中,但任何示例都可以)。
为了澄清,我正在寻找如何使用 the method outlined by Yurin Gal 获得确定性的示例(或解释为什么其他一些方法会产生更好的结果)。
您的模型使用 softmax 激活,因此获得某种不确定性度量的最简单方法是查看输出 softmax 概率:
probs = model.predict(some input data)[0]
probs
数组将是 [0, 1] 范围内数字的 10 元素向量,总和为 1.0,因此它们可以解释为概率。例如,数字 7 的概率只是 probs[7]
.
然后根据这些信息,您可以进行一些 post 处理,通常预测的 class 是概率最高的那个,但您也可以查看 class 第二个最高概率等
如果您想实施 dropout 方法来测量不确定性,您应该执行以下操作:
实现在测试期间也应用dropout的函数:
import keras.backend as K
f = K.function([model.layers[0].input, K.learning_phase()],
[model.layers[-1].output])
使用此函数作为不确定性预测器,例如按照以下方式:
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
当然你可以使用任何不同的函数来计算不确定性。
对投票最多的答案进行了一些更改。现在它对我有用。
这是一种估计模型不确定性的方法。对于其他不确定性来源,我发现 https://eng.uber.com/neural-networks-uncertainty-estimation/ 很有帮助。
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
一种更简单的方法是在推理期间在任何你想要 运行 的 dropout 层上设置 training=True
(本质上告诉该层像始终处于训练模式一样运行 - 所以它是始终存在于训练和推理中)。
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)
以上代码来自此issue。
我想计算 NN 模型 certainty/confidence(参见 What my deep model doesn't know)- 当 NN 告诉我一个图像代表“8”时,我想知道它有多确定。我的模型是 99% 确定它是“8”还是 51% 确定它是“8”,但也可能是“6”?有些数字非常模糊,我想知道模型只是 "flipping a coin".
的哪些图像我找到了一些关于此的理论著作,但我无法将其写入代码。如果我理解正确,我应该多次评估测试图像,同时 "killing off" 不同的神经元(使用 dropout)然后......?
在 MNIST 数据集上工作,我是运行以下模型:
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,))
我应该如何使用此模型进行预测,以便我也能确定其预测结果?我希望能提供一些实际示例(最好是在 Keras 中,但任何示例都可以)。
为了澄清,我正在寻找如何使用 the method outlined by Yurin Gal 获得确定性的示例(或解释为什么其他一些方法会产生更好的结果)。
您的模型使用 softmax 激活,因此获得某种不确定性度量的最简单方法是查看输出 softmax 概率:
probs = model.predict(some input data)[0]
probs
数组将是 [0, 1] 范围内数字的 10 元素向量,总和为 1.0,因此它们可以解释为概率。例如,数字 7 的概率只是 probs[7]
.
然后根据这些信息,您可以进行一些 post 处理,通常预测的 class 是概率最高的那个,但您也可以查看 class 第二个最高概率等
如果您想实施 dropout 方法来测量不确定性,您应该执行以下操作:
实现在测试期间也应用dropout的函数:
import keras.backend as K f = K.function([model.layers[0].input, K.learning_phase()], [model.layers[-1].output])
使用此函数作为不确定性预测器,例如按照以下方式:
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
当然你可以使用任何不同的函数来计算不确定性。
对投票最多的答案进行了一些更改。现在它对我有用。
这是一种估计模型不确定性的方法。对于其他不确定性来源,我发现 https://eng.uber.com/neural-networks-uncertainty-estimation/ 很有帮助。
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
一种更简单的方法是在推理期间在任何你想要 运行 的 dropout 层上设置 training=True
(本质上告诉该层像始终处于训练模式一样运行 - 所以它是始终存在于训练和推理中)。
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)
以上代码来自此issue。