5 votes

Le modèle CNN fait du surapprentissage des données après avoir atteint une précision de 50%

Je tente d'identifier 3 états mentaux (classes) basés sur les données de connectome EEG. La forme des données est de 99x1x34x34x50x130 (à l'origine des données de graphe, mais maintenant représentées sous forme de matrice), respectivement représentatives [sujets, canal, hauteur, largeur, fréquence, séries temporelles]. Pour les besoins de cette étude, je ne peux saisir qu'une image 1x34x34 des données de connectome. D'après des études antérieures, il a été constaté que la bande alpha (8-1 Hz) fournissait le plus d'informations, de sorte que l'ensemble de données a été réduit à 99x1x34x34x4x130. La précision de l'ensemble de test sur les techniques d'apprentissage automatique précédentes telles que les SVM a atteint une précision de test d'environ 75 %. Ainsi, mon objectif est d'obtenir une plus grande précision en utilisant les mêmes données (1x34x34). Étant donné que mes données sont très limitées, j'ai utilisé 1-66 pour l'entraînement et 66-99 pour les tests (ratios fixes et une distribution de classes de 1/3), j'ai pensé diviser les données le long de l'axe des séries temporelles (6e axe) puis moyenné les données pour obtenir une forme de 1x34x34 (à partir par ex. de 1x34x34x4x10, 10 est l'échantillon aléatoire de séries temporelles). Cela m'a donné environ 1500 échantillons pour l'entraînement et 33 pour les tests (tests fixes, les distributions de classes étant de 1/3).

Modèle:

SimpleCNN(
  (conv1): Conv2d(1, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
  (conv2): Conv2d(32, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))    
  (pool1): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
  (drop1): Dropout(p=0.25, inplace=False)
  (fc1): Linear(in_features=9248, out_features=128, bias=True)
  (drop2): Dropout(p=0.5, inplace=False)
  (fc2): Linear(in_features=128, out_features=3, bias=True)
)
CrossEntropyLoss()
Adam (
Parameter Group 0
    amsgrad: False
    betas: (0.9, 0.999)
    eps: 1e-08
    lr: 5e-06
    weight_decay: 0.0001
)

Résultats : L'ensemble d'entraînement peut atteindre une précision de 100 % avec suffisamment d'itérations, mais au détriment de la précision de l'ensemble de test. Après environ 20-50 époques de test, le modèle commence à surajuster l'ensemble d'entraînement et la précision de l'ensemble de test commence à diminuer (tout comme la perte).

description de l'image ici

Ce que j'ai essayé : J'ai essayé de régler les hyperparamètres : lr=0,001 à 0,000001, weight decay=0,0001 à 0,00001. Entraîner sur 1000 époques (inutile car le surajustement se produit en moins de 100 époques). J'ai également essayé d'augmenter/diminuer la complexité du modèle en ajoutant des couches fc supplémentaires et en variant le nombre de canaux dans les couches CNN de 8 à 64. J'ai également tenté d'ajouter plus de couches CNN et le modèle a légèrement moins bien performé avec une précision moyenne d'environ 45 % sur l'ensemble de test. J'ai essayé de planifier manuellement le taux d'apprentissage tous les 10 époques, les résultats étaient les mêmes. Le weight decay n'a pas semblé influencer beaucoup les résultats, je l'ai modifié de 0,1 à 0,000001.

D'après des tests précédents, j'ai un modèle qui atteint une précision de 60 % sur les ensembles de test et d'entraînement. Cependant, lorsque j'essaie de le retrainer, la précision chute immédiatement à environ 40 % sur les deux ensembles (entraînement et test), ce qui n'a pas de sens. J'ai essayé de modifier le taux d'apprentissage de 0,01 à 0,00000001, et j'ai également essayé le weight decay pour cela.

En formant le modèle et en regardant les graphiques, il semble que le modèle ne sait pas ce qu'il fait pour les 5-10 premières époques puis commence à apprendre rapidement pour atteindre une précision d'environ 50 % -60 % sur les deux ensembles. C'est à ce moment que le modèle commence à surajuster, à partir de là la précision du modèle atteint 100 % sur l'ensemble d'entraînement et la précision de l'ensemble de test descend à 33 %, ce qui équivaut à un simple hasard.

Des conseils ?

Édition :

Les sorties du modèle pour l'ensemble de test sont très proches les unes des autres.

0,33960407972335815, 0,311821848154068, 0,34857410192489624

L'écart-type moyen pour l'ensemble de test entre les prédictions pour chaque image est (softmax) :

0,017695341517654846

Cependant, l'écart-type moyen pour l'ensemble d'entraînement est 0,22 donc...

Scores F1 :

Moyenne Micro : 0,6060606060606061
Moyenne Macro : 0,5810185185185186
Moyenne Pondérée : 0,5810185185185186
Scores pour chaque classe : 0,6875 0,5 0,55555556

Voici une matrice de confusion : description de l'image ici

3voto

Maciek Woźniak Points 196

J'ai quelques suggestions, ce que j'essaierais, peut-être que vous l'avez déjà fait:

  • augmenter la probabilité de la désactivation, cela pourrait réduire le surajustement,
  • Je n'ai pas vu ou j'ai manqué cela mais si vous ne le faites pas, mélangez tous les échantillons,
  • il n'y a pas tellement de données, avez-vous pensé à utiliser d'autres NN pour générer plus de données des classes qui ont le moins bon score? Je ne suis pas sûr si c'est le cas ici mais même la rotation aléatoire, le redimensionnement des images peut produire plus d'exemples d'entraînement,
  • une autre approche que vous pouvez essayer, si vous ne l'avez pas déjà fait, c'est d'utiliser le transfert d'apprentissage en utilisant un autre réseau CNN populaire et voir comment il fait le travail, alors vous pouvez faire une comparaison, que ce soit un problème avec votre architecture ou le manque d'exemples :) Je sais que ce ne sont que des suggestions mais peut-être, si vous n'en avez pas essayé quelques-unes, elles vous rapprocheront de la solution. Bonne chance!

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X