Por que meu modelo Keras aprende a reconhecer os antecedentes?

9

Estou tentando treinar essa implementação Keras do Deeplabv3 + no Pascal VOC2012, usando o modelo pré-treinado (que também foi treinado nesse conjunto de dados).

Eu obtive resultados estranhos com a precisão convergindo rapidamente para a 1.0:

5/5 [==============================] - 182s 36s/step - loss: 26864.4418 - acc: 0.7669 - val_loss: 19385.8555 - val_acc: 0.4818
Epoch 2/3
5/5 [==============================] - 77s 15s/step - loss: 42117.3555 - acc: 0.9815 - val_loss: 69088.5469 - val_acc: 0.9948
Epoch 3/3
5/5 [==============================] - 78s 16s/step - loss: 45300.6992 - acc: 1.0000 - val_loss: 44569.9414 - val_acc: 1.0000

Testar o modelo também oferece 100% de precisão.

Decidi plotar previsões no mesmo conjunto de imagens aleatórias antes e após o treinamento, e descobri que o modelo é incentivado a dizer que tudo é apenas pano de fundo (essa é a 1ª classe do Pascal VOC2012).

insira a descrição da imagem aqui

insira a descrição da imagem aqui

Eu sou um iniciante no aprendizado profundo e precisaria de ajuda para descobrir de onde isso poderia vir.

Eu pensei que talvez pudesse ser minha função de perda, que eu defini como:

def image_categorical_cross_entropy(y_true, y_pred):
    """
    :param y_true: tensor of shape (batch_size, height, width) representing the ground truth.
    :param y_pred: tensor of shape (batch_size, height, width) representing the prediction.
    :return: The mean cross-entropy on softmaxed tensors.
    """
    return tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits_v2(logits=y_pred, labels=y_true))

Estou um pouco incerto se meus tensores têm a forma correta. Estou usando a API do conjunto de dados do TF para carregar .tfrecordarquivos e meu tensor de anotação está em forma (batch_size, height, width). Seria o (batch_size, height, width, 21)que é necessário? Outros erros de dentro do modelo surgem quando tento separar a imagem da anotação em um tensor contendo 21 imagens (uma para cada classe):

tensorflow.python.framework.errors_impl.InvalidArgumentError: Incompatible shapes: [12,512,512,21] vs. [12,512,512]
         [[Node: metrics/acc/Equal = Equal[T=DT_INT64, _device="/job:localhost/replica:0/task:0/device:GPU:0"](metrics/acc/ArgMax, metrics/acc/ArgMax_1)]]
         [[Node: training/Adam/gradients/bilinear_upsampling_2_1/concat_grad/Slice_1/_13277 = _Recv[client_terminated=false, recv_device="/job:localhost/replica:0/task:0/device:GPU:1", send_device="/job:localhost/replica:0/task:0/device:CPU:0", send_device_incarnation=1, tensor_name="edge_62151_training/Adam/gradients/bilinear_upsampling_2_1/concat_grad/Slice_1", tensor_type=DT_FLOAT, _device="/job:localhost/replica:0/task:0/device:GPU:1"]()]]

Obrigado pela ajuda!

Matt
fonte
5
Alguns itens a serem considerados aqui, quase não sei por onde começar (1) você está usando uma amostra de tamanho 5 para treinamento ??? (2) O que, se houver, pré-processamento você está fazendo com suas imagens? Sinto que a resposta está dentro disso e (3) você teria que fornecer muito mais informações sobre seu modelo. Quantas amostras rotuladas você tem? Quantas categorias possíveis? Você tem um conjunto de treinamento equilibrado? (4) sua precisão de 1,0 basicamente não significa nada porque sua perda é super alta e está aumentando. Sua perda deve diminuir à medida que sua precisão melhora.
I_Play_With_Data
(1) Estou usando lotes de tamanho 12, mas isso é irrelevante, eu acho. Eu mostrei apenas três épocas pequenas de apenas 5 etapas aqui, porque é a velocidade com que converge. (2) Meu pré-processamento consiste em algum aumento e redimensionamento (possivelmente corte) para 512x512 para cada imagem e sua anotação associada. (3) existem cerca de 11.500 imagens rotuladas no Pascal VOC 2012. Concedido que a maioria dos trabalhos atinja 85% + mIOU neste conjunto de dados, eu suponho que seja equilibrado. Existem 20 categorias diferentes neste conjunto de dados, mais uma para o plano de fundo ou «ambígua», para um total de 21. #
Matt
Eu sou curioso. Você encontrou o motivo dos resultados do seu modelo?
Mark.F
3
Se você compartilhou seu código, seria possível encontrar o erro.
Dmytro Prylipko
11
O fato de um modelo pré-treinado encontrar uma maneira de obter 100% de precisão em três épocas, usando os mesmos dados usados ​​originalmente, me faz pensar que o problema é que seus rótulos de treinamento estão errados, talvez todos configurados para o rótulo que corresponde para o fundo. De qualquer forma, dê uma olhada neste segmento de problema , onde as pessoas discutem seus problemas e soluções para ajustar o modelo. O modelo não está necessariamente quebrado e o bug do batchnorm no Tensorflow pode ser solucionado.
N1k31t4 02/03/19

Respostas:

1

Seu modelo está se ajustando demais. Cada época tem apenas 5 imagens. O modelo está "memorizando" a resposta para cada imagem.

Para minimizar a chance de sobreajuste, aumente o número de imagens. Deve haver milhares de imagens de exemplo para cada categoria de objeto.

Brian Spiering
fonte