Pourquoi mon modèle Keras apprend-il à reconnaître l'arrière-plan?

9

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).

entrez la description de l'image ici

entrez la description de l'image ici

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 .tfrecordfichiers, 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!

Mat
la source
5
Quelques éléments à considérer ici, je ne sais presque pas par où commencer (1) utilisez-vous un échantillon de 5 pour la formation ??? (2) Que faites-vous, le cas échéant, de prétraitement à vos images? J'ai le sentiment que la réponse se situe à l'intérieur de cela et (3) vous devrez fournir beaucoup plus d'informations sur votre modèle. Combien d'échantillons étiquetés avez-vous? Combien de catégories possibles? Avez-vous un ensemble d'entraînement équilibré? (4) votre précision de 1,0 ne signifie essentiellement rien car votre perte est super élevée et croissante. Votre perte devrait diminuer à mesure que votre précision s'améliore.
I_Play_With_Data
(1) J'utilise des lots de taille 12 mais ce n'est pas pertinent, je pense. Je n'ai montré que 3 petites époques de seulement 5 étapes ici, car c'est à quelle vitesse il converge. (2) Mon prétraitement consiste en une augmentation et un redimensionnement (éventuellement un recadrage) à 512x512 pour chaque image et son annotation associée. (3) il y a environ 11 500 images étiquetées dans Pascal VOC 2012. Étant donné que la plupart des articles atteignent 85% + mIOU sur cet ensemble de données, je suppose qu'il est équilibré. Il y a 20 catégories différentes dans cet ensemble de données plus une pour le fond ou «ambiguë», pour un total de 21.
Matt
Je suis curieux. Avez-vous trouvé la raison des résultats de votre modèle?
Mark.F
3
Si vous partagiez votre code, il serait possible de trouver l'erreur.
Dmytro Prylipko
1
Le fait qu'un modèle pré-formé trouve un moyen d'obtenir une précision de 100% en 3 époques, en utilisant les mêmes données que celles utilisées à l'origine, me fait penser que le bug est que vos étiquettes de formation sont incorrectes, peut-être toutes réglées sur l'étiquette qui correspond en arrière-plan. Dans tous les cas, jetez un œil à ce fil de discussion , où les gens discutent de leurs problèmes et de leurs solutions pour affiner le modèle. Le modèle n'est pas nécessairement cassé, et le bogue batchnorm dans Tensorflow peut être corrigé.
n1k31t4

Réponses:

1

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.

Brian Spiering
la source