21

我想计算神经网络模型的确定性/置信度(见What my deep model doesn't know) - 当NN告诉我的形象代表“8”,我想知道它是如何确定的。我的模型99%确定它是“8”还是51%是“8”,但它也可以是“6”?有些数字相当模糊,我想知道模型只是“翻转硬币”的图像。如何使用Keras计算预测不确定性?

我发现一些有关此理论著作,但我有麻烦把这个代码。如果我理解正确,我应该多次评估测试图像,同时“杀死”不同的神经元(使用丢失),然后......?

上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,)) 

问:我应该怎么用这个模型预测,使我得到了肯定的预测大概过?我会感激一些实际的例子(最好在凯拉斯,但任何会做)。为了澄清,我正在寻找如何使用Yurin Gal概述的方法(或解释为什么其他方法产生更好的结果)得到确定性的例子。

回答

12

如果你想实施辍学的方法来测量的不确定性,你应该做到以下几点:

  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 
    

当然你可以使用任何不同的函数来计算的不确定性。

+0

这看起来像我正在寻找的!不幸的是,当我离开时赏金过期了),所以我会开始并奖励另一个。谢谢! (编辑:但当然,我只能奖励双倍,并且只能在24小时后...直到明天它才是......) – johndodo

5

你的模型使用SOFTMAX激活,所以最简单的方法,以获得某种不确定性度量的是看输出SOFTMAX概率:

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

probs阵列于是将有10元素矢量[0,1]范围内的数字总和为1.0,因此它们可以被解释为概率。例如,数字7的概率只是probs[7]

然后用这些信息,你可以做一些后期处理,通常是预测类是一个具有最高概率,但你也可以看看类第二高的概率等

+1

谢谢你的回答,但是链接[文章](http://mlg.eng.cam.ac.uk/yarin/blog_3d801aa532c1ce.html)似乎同意你的意见:*“在这个模型中,我们养活我们有趣的是,这些**概率是不够的**,看看我们的模型在其预测一定与否预测到SOFTMAX这为我们提供了不同类别(10位)的概率。这是因为标准模型将通过softmax而不是整个分布来传递预测均值。“*我错过了什么吗? – johndodo

+1

@johndodo它并不反对我的回答,我从来没有声称拥有最好的方法,只是最简单的方法。 –

+0

是的。它是否工作? :)我仍然希望找到其他答案... – johndodo