21

NN 모델 확실성/확신을 계산하고 싶습니다. (What my deep model doesn't know 참조) - NN이 이미지가 "8"을 나타낼 때, 나는 그것이 얼마나 확실한 지 알고 싶습니다. 제 모델이 "8"인지 또는 51 %인지 "8"인지 99 % 확신합니까? "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,)) 

질문 : 너무 예측에 대한 자사의 확신을 얻을 수 있도록 내가이 모델로 예측하는 방법? 실용적인 예를 들어 주시면 감사하겠습니다 (Keras에서 가능하면 좋지만 모든 것이 가능합니다).

편집 : 나는이 Yurin 갈에 의해 설명 된 방법 (또는 다른 방법은 더 나은 결과를 얻을 이유를 설명)를 사용하여 확실성을 얻을 수있는 방법, 예를 들어 찾고 있어요 명확히한다. probs 어레이는 다음의 10 요소 벡터 것이다

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

가장 간단한 방법은 불확실성 계수 일종의 획득하도록

답변

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를 활성화되어 사용 [0, 1] 범위의 숫자는 1.0으로 합쳐져서 확률로 해석 될 수 있습니다. 예를 들어, 숫자 7에 대한 확률은 단지 probs[7]입니다. , 일부 사후 처리를 할 수있는이 정보를 다음

는, 일반적으로 예측 클래스는 확률이 가장 높은 사람이지만, 당신은 또한 두 번째로 높은 확률로 클래스를 볼 수 등

+1

링크 된 [게시물] (http://mlg.eng.cam.ac.uk/yarin/blog_3d801aa532c1ce.html)이 당신에게 동의하지 않는 것처럼 보입니다. * "이 모델에서는 우리가 우리가 다른 클래스 (10 자리)에 대한 확률을 제공하는 softmax에 대한 예측. 흥미롭게도, ** 이러한 확률은 우리 모델이 예측에서 확실한 지 아닌지를 확인하기에는 충분하지 않습니다. 전체 분포보다는 softmax를 통해 예측 평균을 전달하십시오. "* 나는 무엇인가 놓치고 있습니까? – johndodo

+1

@johndodo 그것은 내 대답에 동의하지 않는다, 나는 가장 간단한 방법 중 가장 좋은 방법을 가지고 있다고 결코 주장하지 않았다. –

+0

참. 그래도 작동합니까? :) 나는 아직도 다른 어떤 대답을 찾기를 희망한다 ... – johndodo