J'essaie de former cette implémentation Keras de Deeplabv3 + sur Pascal VOC2012, en utilisant le modèle pré-formé (qui a également été formé sur cet ensemble de données).
J'ai obtenu des résultats étranges avec une précision convergeant rapidement vers 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
Le test du modèle donne également une précision de 100%.
J'ai décidé de tracer des prédictions sur le même ensemble d'images aléatoires avant et après l'entraînement, et j'ai constaté que le modèle est encouragé à dire que tout n'est que du fond (c'est la 1ère classe en Pascal VOC2012).
Je suis assez nouveau dans l'apprentissage en profondeur et j'aurais besoin d'aide pour comprendre d'où cela pourrait provenir.
J'ai pensé que cela pourrait peut-être être ma fonction de perte, que j'ai définie comme:
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))
Je ne sais pas trop si mes tenseurs ont la bonne forme. J'utilise l'API de jeu de données de TF pour charger des .tfrecord
fichiers, et mon tenseur d'annotation est de forme (batch_size, height, width)
. Serait (batch_size, height, width, 21)
ce qui est nécessaire? D'autres erreurs de l'intérieur du modèle surviennent lorsque j'essaie de séparer l'image d'annotation en un tenseur contenant 21 images (une pour chaque 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"]()]]
Merci de votre aide!
Réponses:
Votre modèle est trop adapté. Chaque époque n'a que 5 images. Le modèle «mémorise» la réponse pour chaque image.
Afin de minimiser les risques de sur-ajustement, augmentez le nombre d'images. Il devrait y avoir plusieurs milliers d'exemples d'images pour chaque catégorie d'objet.
la source