Por que minha previsão Keras está sempre próxima de 100% para uma classe de imagem?

Nov 27 2020

Estou usando Keras (no topo do TF 2.3) para treinar um classificador de imagens. Em alguns casos, tenho mais de duas classes, mas geralmente há apenas duas classes ("bom" ou "ruim"). Estou usando a tensorflow.keras.applications.VGG16classe como modelo base com um classificador personalizado na parte superior, assim:

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)

Como você pode ver na última camada (saída), estou usando uma softmaxfunção de ativação. Em seguida, eu compilo o modelo inteiro com a categorical_crossentropyfunção de perda e treino com dados de imagem codificados a quente (rótulos).

No geral, o modelo tem um desempenho muito bom, estou feliz com os resultados, alcancei mais de 99% de precisão de teste e validação com nosso conjunto de dados. Há uma coisa que eu não entendo:

Quando chamo predict()o modelo Keras e vejo os resultados da previsão, eles são sempre 0 ou 1 (ou pelo menos muito, muito próximo disso, como 0,000001 e 0,999999). Portanto, meu classificador parece estar certo de que uma imagem pertence à classe "boa" ou "má" (por exemplo, se estou usando apenas duas classes). Eu estava supondo, no entanto, que geralmente essas previsões não são tão claras, mais em termos de "o modelo pensa com uma probabilidade de 80% de que essa imagem pertence à classe A" - mas como disse no meu caso é sempre 100% certo.

Alguma ideia de por que isso pode ser o caso?

Respostas

2 nbro Nov 28 2020 at 09:20

As redes neurais tradicionais podem ser superconfiantes (ou seja, dar uma probabilidade próxima de$0$ ou $1$) mesmo quando eles estão errados, então você não deve interpretar a probabilidade de que ela produz como uma medida de incerteza (ou seja, como uma medida de quanto é confiante de que a classe prevista associada é a correta), já que é essencialmente errada . Veja esta e esta respostas para mais detalhes sobre isso.

Dado que este excesso de confiança não é desejável em muitos cenários (como o da saúde, onde os médicos também querem saber o quão confiante está o modelo sobre as suas previsões, para decidir se darão ou não um determinado medicamento ao paciente), a comunidade ML vem tentando incorporar a quantificação / estimativa de incerteza em redes neurais. Se você estiver interessado neste tópico, você pode ler o artigo Weight Incerty in Neural Network (2015) de Blundell et al., Que propõe um tipo específico de rede neural Bayesiana, ou seja, uma rede neural que modela a incerteza sobre os valores reais de os pesos, a partir dos quais também podemos quantificar / estimar a incerteza sobre as entradas. Este artigo não deve ser muito difícil de ler se você já estiver familiarizado com os detalhes dos autoencoders variacionais.

Portanto, a resposta à sua pergunta é: sim, é possível que a probabilidade de saída esteja próxima de $1$porque as redes neurais podem ser superconfiantes. (Estou assumindo que os valores retornados por tf.keras's predictmétodo de probabilidades: Eu não me lembro mais, então eu assumi que você não cometer nenhum erro).

Uma pergunta semelhante já foi feita aqui no passado . A resposta aceita deve fornecer mais detalhes sobre os diferentes tipos de incerteza e soluções.

1 chessprogrammer Nov 27 2020 at 06:13

Sem mais detalhes sobre a natureza do conjunto de dados, é impossível saber com certeza. No entanto, aqui estão algumas causas prováveis:

  1. Você estava chamando a previsão nos dados de treinamento, não nos dados de teste. A rede terá muito mais certeza sobre as imagens que treinou do que sobre as imagens que nunca viu antes.

  2. Seu modelo superestima os dados. Isso pode acontecer quando você usa um modelo excessivamente complexo em um pequeno conjunto de dados. Você pode querer experimentar a regularização.

  3. Você estava vendo uma amostra de imagens muito pequena. Você fez previsões em todas as imagens ou apenas em algumas? Nesse último caso, é possível que você apenas tenha escolhido uma amostra na qual a rede esteja muito confiante.