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).
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 .tfrecord
archivos, 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!