如何使用Keras计算预测不确定性?
deep-learning
keras
machine-learning
neural-network
5
0

我想计算NN模型的确定性/置信度(请参阅我的深层模型不知道的内容 )-当NN告诉我图像代表“ 8”时,我想知道它的确定性。我的模型是99%肯定是“ 8”还是51%是“ 8”,但也可能是“ 6”?有些数字是非常模棱两可的,我想知道该模型只是“翻转硬币”的图像。

我已经找到了一些有关此的理论著作,但我很难将其放入代码中。如果我理解正确,我应该多次评估测试图像,同时“杀死”不同的神经元(使用辍学),然后...?

在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中,但是任何例子都可以)。

为了澄清,我正在寻找一个示例,该示例如何使用Yurin Gal概述的方法来获得确定性(或解释为什么其他方法可以产生更好的结果)。

参考资料:
Stack Overflow
收藏
评论
共 4 个回答
高赞 时间 活跃

您的模型使用softmax激活,因此获得某种不确定性度量的最简单方法是查看输出softmax概率:

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

所述probs然后阵列将是数字的10元素矢量在[0,1]范围的总和为1.0,因此它们可以被解释为概率。例如,数字7的概率仅为probs[7]

然后,使用此信息可以进行一些后处理,通常,预测的类是概率最高的类,但是您也可以查看具有第二高概率的类,等等。

收藏
评论

一种更简单的方法是在您要在推理过程中运行的所有辍学层上也都设置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)

上面的代码就是来自这个问题

收藏
评论

如果要实施辍学方法来测量不确定性,则应执行以下操作:

  1. 实现在测试期间也应用辍学的功能:

     import keras.backend as K f = K.function([model.layers[0].input, K.learning_phase()], [model.layers[-1].output]) 
  2. 将此功能用作不确定性预测器,例如,通过以下方式:

     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
收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题

关于我们

常见问题

内容许可

联系我们

@2020 AskGo
京ICP备20001863号