Machine learning 如何使用Keras计算预测不确定性?

Machine learning 如何使用Keras计算预测不确定性?,machine-learning,neural-network,deep-learning,keras,uncertainty,Machine Learning,Neural Network,Deep Learning,Keras,Uncertainty,我想计算NN模型的确定度/置信度(请参阅)-当NN告诉我图像代表“8”时,我想知道它有多确定。我的型号99%确定是“8”还是51%确定是“8”,但也可能是“6”?有些数字是相当模糊的,我想知道该模型只是“抛硬币”的图像 我已经找到了一些关于这方面的理论著作,但我很难将其写入代码。如果我理解正确,我应该多次评估测试图像,同时“杀死”不同的神经元(使用脱落),然后 在处理MNIST数据集时,我运行以下模型: from keras.models import Sequential from keras

我想计算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,但任何都可以)


为了澄清这一点,我正在寻找一个关于如何使用确定性的示例(或者解释为什么其他方法会产生更好的结果)

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

probs = model.predict(some input data)[0]
然后,
probs
数组将是[0,1]范围内的数字的10个元素向量,总和为1.0,因此它们可以被解释为概率。例如,数字7的概率只是
probs[7]

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

如果您想实施退出方法来测量不确定性,您应该执行以下操作:

  • 执行在测试期间也应用退出的功能:

    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
    

  • 当然,您可以使用任何不同的函数来计算不确定性

    对得票最多的答案做了一些修改。现在它对我有用了

    这是一种估算模型不确定性的方法。对于其他不确定性的来源,我觉得很有帮助


    一种更简单的方法是在推理过程中要运行的任何退出层上设置
    training=True
    (本质上告诉该层要像始终处于培训模式一样运行-因此它始终存在于培训和推理中)

    导入keras
    输入=keras.Input(形状=(10,))
    x=keras.层密度(3)(输入)
    输出=keras.layers.Dropout(0.5)(x,训练=真)
    模型=keras.model(输入、输出)
    

    上面的代码来自此。

    感谢您的回答,但是链接似乎不同意您的观点:“在这个模型中,我们将我们的预测输入到softmax中,它为我们提供了不同类别(10位数字)的概率.有趣的是,这些概率不足以证明我们的模型在预测中是否确定。这是因为标准模型会通过softmax而不是整个分布传递预测平均值。“我遗漏了什么吗?@Johndoo It不同意我的答案,我从未声称有最好的方法,这是最简单的一条。这条曲线与一个很好的确定函数的曲线不匹配。你可以得到一个迂回的想法(如果它很高或很低),但仅此而已。你不能依赖于预测结果的确定性。我同意概率给出了一些关于结果不确定性的想法,但提问者引用的是模型不确定性,这就像问一个问题:模型对概率预测的不确定性是什么?你可以对一个非常“矛盾”的概率有非常高的把握,反之亦然。例如。你可以99%确定概率在[49.9-50.1%]范围内,例如,当你掷硬币时,你知道如果着陆头约为50%,概率为50%。Softmax概率不是衡量不确定性的好指标。看,这看起来正是我要找的!不幸的是,赏金在我不在的时候过期了),所以我会开始奖励另一个。非常感谢。(编辑:但当然,我只能奖励双倍,而且只能在24小时后…所以直到明天它是…:)n_iter在你的函数@Marcin Możejkow中代表什么当你说不确定性时,当它说0.93时,它是否意味着93%的不确定性或93%的确定性是选择?这个函数有问题。这是用什么tensorflow,keras版本写的?我不明白。。对于每次相同的输入,模型不会预测完全相同的值吗?在这种情况下,var(方差)每次将为0。。当我为我的代码实现这个时。。我10次都得到了完全相同的预测值(n_iter=10),我尝试在这里使用您的实现,虽然它似乎正常工作,但我似乎只收到了相同预测的矩阵,以及包含0的不确定性矩阵?感谢您的帮助!谢谢如果我使用
    keras.Sequential([])
    ,我该如何使用你的方法?@Samuel我来晚了,但可能对其他人有帮助:不,
    training=True
    ,如果你使用Sequential API,就无法设置-你需要使用示例中所示的函数API。也就是说,您可能希望签出,这允许在顺序API中实现相同的功能(免责声明:我是作者)
    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