Keras 예측이 하나의 이미지 클래스에 대해 항상 100 %에 가까운 이유는 무엇입니까?
이미지 분류기를 훈련하기 위해 Keras (TF 2.3 위에)를 사용하고 있습니다. 어떤 경우에는 두 개 이상의 클래스가 있지만 종종 두 클래스 ( "좋음"또는 "나쁨") 만 있습니다. 다음 tensorflow.keras.applications.VGG16
과 같이 사용자 지정 분류 기가있는 기본 모델로 클래스를 사용하고 있습니다 .
input_layer = layers.Input(shape=(self.image_size, self.image_size, 3), name="model_input")
base_model = VGG16(weights="imagenet", include_top=False, input_tensor=input_layer)
model_head = base_model.output
model_head = layers.AveragePooling2D(pool_size=(4, 4))(model_head)
model_head = layers.Flatten()(model_head)
model_head = layers.Dense(256, activation="relu")(model_head)
model_head = layers.Dropout(0.5)(model_head)
model_head = layers.Dense(len(self.image_classes), activation="softmax")(model_head)
마지막 (출력) 레이어에서 볼 수 있듯이 softmax
활성화 기능을 사용하고 있습니다. 그런 다음 categorical_crossentropy
손실 함수로 전체 모델을 컴파일하고 원-핫 인코딩 된 이미지 데이터 (라벨)로 훈련합니다.
모든 모델이 매우 잘 수행되고 결과에 만족하며 데이터 세트로 99 % 이상의 테스트 및 검증 정확도를 달성했습니다. 그래도 이해하지 못하는 한 가지가 있습니다.
predict()
Keras 모델을 호출 하고 예측 결과를 보면 항상 0 또는 1입니다 (또는 최소한 0.000001 및 0.999999와 같이 그에 매우 가깝습니다). 따라서 내 분류자는 이미지가 "좋은"클래스에 속하는지 "나쁜"클래스에 속하는지 확실히 확신하는 것 같습니다 (예 : 두 클래스 만 사용하는 경우). 그러나 저는 일반적으로 이러한 예측이 명확하지 않다는 가정하에있었습니다. "모델은이 이미지가 클래스 A에 속할 확률이 80 %라고 생각합니다" 라는 측면에서 더 그렇습니다. 하지만 제 경우에는 항상 100 %입니다. 확실한.
왜 이것이 사실 일 수 있는지 아이디어가 있습니까?
답변
기존의 신경망은 지나치게 확신 할 수 있습니다 (예 :$0$ 또는 $1$) 그들이 틀렸을 때에도, 불확실성 의 척도로 (즉, 연관된 예측 클래스가 올바른 것으로 확신하는 정도의 척도로) 생성 될 확률을 본질적으로 잘못 해석 해서는 안됩니다. . 이에 대한 자세한 내용은 this 및 this 답변을 참조하십시오.
이러한 과신은 많은 시나리오에서 바람직하지 않다는 점을 감안할 때 (예 : 의사 가 환자에게 특정 약물을 투여할지 여부를 결정하기 위해 모델이 예측에 대해 얼마나 확신 하는지 알고 싶어하는 의료 등 ), ML 커뮤니티 신경망에 불확실성 정량화 / 추정 을 통합하려고 노력해 왔습니다 . 이 주제에 관심이 있다면 Blundell et al. 의 논문 Weight Uncertainty in Neural Network (2015)에서 특정 유형의 Bayesian 신경망, 즉 실제 값에 대한 불확실성을 모델링하는 신경망을 제안합니다. 입력에 대한 불확실성을 정량화 / 추정 할 수있는 가중치. 이 문서는 이미 변형 자동 인코더의 세부 사항에 익숙하다면 읽기 어렵지 않습니다.
따라서 귀하의 질문에 대한 대답은 다음과 같습니다. 예, 출력 확률이 $1$신경망은 과신 할 수 있기 때문입니다. ( tf.keras
의 predict
메소드가 반환하는 값 이 확률이라고 가정하고 있습니다. 더 이상 기억이 나지 않으므로 실수하지 않은 것으로 가정했습니다.)
유사한 질문이 과거에 이미 여기 에서 제기되었습니다 . 허용되는 답변 은 다양한 유형의 불확실성과 솔루션에 대한 자세한 내용을 제공해야합니다.
데이터 세트의 특성에 대한 자세한 내용이 없으면 확실하게 알 수 없습니다. 그러나 다음과 같은 몇 가지 가능한 원인이 있습니다.
테스트 데이터가 아니라 훈련 데이터에 대해 예측을 호출했습니다. 네트워크는 이전에 본 적이없는 이미지보다 학습 된 이미지에 대해 훨씬 더 확실합니다.
모델이 데이터를 과적 합합니다. 이는 작은 데이터 세트에서 지나치게 복잡한 모델을 사용할 때 발생할 수 있습니다. 정규화를 실험 해 볼 수 있습니다.
너무 작은 이미지 샘플을보고있었습니다. 모든 이미지에 대해 예측을 실행 했습니까? 아니면 몇 개만 실행 했습니까? 후자의 경우 네트워크가 매우 확신하는 샘플을 방금 선택했을 수 있습니다.