¿Por qué mi modelo Keras aprende a reconocer el fondo?

9

Estoy tratando de entrenar esta implementación Keras de Deeplabv3 + en Pascal VOC2012, usando el modelo pre-entrenado (que también fue entrenado en ese conjunto de datos).

Obtuve resultados extraños con la precisión rápidamente convergente 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

Probar el modelo también proporciona una precisión del 100%.

Decidí trazar predicciones en el mismo conjunto de imágenes aleatorias antes y después del entrenamiento, y descubrí que se anima al modelo a decir que todo es solo fondo (esa es la primera clase en Pascal VOC2012).

ingrese la descripción de la imagen aquí

ingrese la descripción de la imagen aquí

Soy bastante nuevo en el aprendizaje profundo y necesitaría ayuda para descubrir de dónde podría venir esto.

Pensé que quizás podría ser mi función de pérdida, que definí 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))

No estoy seguro de si mis tensores tienen la forma correcta. Estoy usando la API del conjunto de datos de TF para cargar .tfrecordarchivos, y mi tensor de anotación está en forma (batch_size, height, width). ¿ (batch_size, height, width, 21)Sería lo que se necesita? Otros errores del interior del modelo surgen cuando trato de separar la imagen de anotación en un tensor que contiene 21 imágenes (una para cada clase):

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"]()]]

¡Gracias por tu ayuda!

Mate
fuente
55
Unos cuantos elementos para considerar aquí, casi no sé por dónde empezar (1) ¿estás usando un tamaño de muestra de 5 para entrenar? (2) ¿Qué, si alguno, preprocesamiento está haciendo a sus imágenes? Tengo la sensación de que la respuesta se encuentra dentro de esto y (3) tendrías que proporcionar mucha más información sobre tu modelo. ¿Cuántas muestras etiquetadas tienes? ¿Cuántas categorías posibles? ¿Tienes un conjunto de entrenamiento equilibrado? (4) su precisión de 1.0 básicamente no significa nada porque su pérdida es muy alta y está aumentando. Su pérdida debería disminuir a medida que mejore su precisión.
I_Play_With_Data
(1) Estoy usando lotes de tamaño 12 pero creo que esto es irrelevante. Solo mostré 3 épocas pequeñas de solo 5 pasos aquí porque eso es lo rápido que converge. (2) Mi preprocesamiento consiste en un aumento y un cambio de escala (posiblemente un recorte) a 512x512 para cada imagen y su anotación asociada. (3) hay aproximadamente 11,500 imágenes etiquetadas en Pascal VOC 2012. Concedido que la mayoría de los documentos alcanzan 85% + mIOU en este conjunto de datos, supongo que está equilibrado. Hay 20 categorías diferentes en este conjunto de datos más una para el fondo o «ambiguo», para un total de 21.
Matt
Soy curiosidad ¿Encontró la razón de los resultados de su modelo?
Mark.F
3
Si compartió su código, sería posible encontrar el error.
Dmytro Prylipko
1
El hecho de que un modelo pre-entrenado encuentre una manera de obtener el 100% de precisión en 3 épocas, usando los mismos datos que se usaron originalmente, me hace pensar que el error es que las etiquetas de entrenamiento son incorrectas, tal vez todas configuradas en la etiqueta que corresponde De trasfondo. En cualquier caso, eche un vistazo a este hilo de problemas , donde las personas discuten sus problemas y soluciones para ajustar el modelo. El modelo no está necesariamente roto y se puede solucionar el error de batchnorm en Tensorflow.
n1k31t4

Respuestas:

1

Tu modelo está sobreajustado. Cada época solo tiene 5 imágenes. El modelo está "memorizando" la respuesta para cada imagen.

Para minimizar la posibilidad de sobreajuste, aumente el número de imágenes. Debería haber varios miles de imágenes de ejemplo para cada categoría de objeto.

Brian Spiering
fuente