web-dev-qa-db-fra.com

Explications possibles de l'augmentation des pertes?

J'ai un ensemble d'images de 40 000 images provenant de quatre pays différents. Les images contiennent des sujets divers: scènes d'extérieur, scènes de ville, menus, etc. Je voulais utiliser le deep learning pour géolocaliser des images.

J'ai commencé avec un petit réseau de 3 couches conv-> relu-> pool, puis j'ai ajouté 3 autres pour approfondir le réseau car la tâche d'apprentissage n'est pas simple.

Ma perte fait cela (avec les réseaux à 3 et 6 couches): enter image description here :

La perte commence en fait un peu en douceur et diminue pendant quelques centaines de pas, mais commence ensuite à remonter.

Quelles sont les explications possibles de l'augmentation de ma perte comme ceci?

Mon taux d'apprentissage initial est très bas: 1e-6, mais j'ai également essayé 1e-3 | 4 | 5. J'ai vérifié la conception du réseau sur un minuscule ensemble de données de deux classes avec un sujet distinct de la classe et la perte diminue continuellement comme souhaité. La précision du train oscille à ~ 40%

9
JohnAllen

Je dirais normalement que votre taux d'apprentissage est trop élevé, mais il semble que vous l'ayez exclu. Vous devez vérifier l'ampleur des nombres entrant et sortant des couches. Pour ce faire, vous pouvez utiliser tf.Print. Peut-être que vous entrez en quelque sorte une image noire par accident ou que vous pouvez trouver la couche où les chiffres deviennent fous.

Aussi comment calculez-vous l'entropie croisée? Vous voudrez peut-être ajouter un petit epsilon à l'intérieur du journal car sa valeur ira à l'infini lorsque son entrée se rapprochera de zéro. Ou mieux encore, utilisez la fonction tf.nn.sparse_softmax_cross_entropy_with_logits(...) qui prend soin de la stabilité numérique pour vous.

Étant donné que le coût est si élevé pour votre entropie croisée, il semble que le réseau génère presque tous les zéros (ou des valeurs proches de zéro). Puisque vous n'avez posté aucun code, je ne peux pas dire pourquoi. Je pense que vous pouvez simplement mettre à zéro quelque chose dans le calcul de la fonction de coût par accident.

4
chasep255

J'étais également confronté au problème, j'utilisais la bibliothèque de keras (backend tensorflow)

    Epoch 00034: saving model to /home/ubuntu/temp/trained_data1/final_dev/final_weights-improvement-34-0.627.hdf50
Epoch 35/150
226160/226160 [==============================] - 65s 287us/step - loss: 0.2870 - acc: 0.9331 - val_loss: 2.7904 - val_acc: 0.6193
Epoch 36/150
226160/226160 [==============================] - 65s 288us/step - loss: 0.2813 - acc: 0.9331 - val_loss: 2.7907 - val_acc: 0.6268

Epoch 00036: saving model to /home/ubuntu/temp/trained_data1/final_dev/final_weights-improvement-36-0.627.hdf50
Epoch 37/150
226160/226160 [==============================] - 65s 286us/step - loss: 0.2910 - acc: 0.9330 - val_loss: 2.5704 - val_acc: 0.6327
Epoch 38/150
226160/226160 [==============================] - 65s 287us/step - loss: 0.2982 - acc: 0.9321 - val_loss: 2.5147 - val_acc: 0.6415

Epoch 00038: saving model to /home/ubuntu/temp/trained_data1/final_dev/final_weights-improvement-38-0.642.hdf50
Epoch 39/150
226160/226160 [==============================] - 68s 301us/step - loss: 0.2968 - acc: 0.9318 - val_loss: 2.7375 - val_acc: 0.6409
Epoch 40/150
226160/226160 [==============================] - 68s 299us/step - loss: 0.3124 - acc: 0.9298 - val_loss: 2.8359 - val_acc: 0.6047

Epoch 00040: saving model to /home/ubuntu/temp/trained_data1/final_dev/final_weights-improvement-40-0.605.hdf50
Epoch 41/150
226160/226160 [==============================] - 65s 287us/step - loss: 0.2945 - acc: 0.9315 - val_loss: 3.5825 - val_acc: 0.5321
Epoch 42/150
226160/226160 [==============================] - 65s 287us/step - loss: 0.3214 - acc: 0.9278 - val_loss: 2.5816 - val_acc: 0.6444

Quand j'ai vu mon modèle, le modèle était composé de trop de neurones, bref le modèle était trop adapté. J'ai diminué le nombre de neurones en 2 couches denses (de 300 neurones à 200 neurones)

1
yunus