2 votes

extraire les caractéristiques CNN des couches intermédiaires

Je veux tester la performance de chaque couche convolutive de mon architecture de réseau neuronal convolutif (CNN) en utilisant le SVM. J'utilise la boîte à outils MatConvNet de Matlab.

Les couches sont comme ça : Conv1 Relu1 Pool1 (3x3, 32 caractéristiques) -> Conv2 Relu2 Pool2 (3x3, 64 caractéristiques) -> Conv3 Relu3 Pool3 (3x3, 128 caractéristiques) ->Conv4 Relu4 (1x1, 256 caractéristiques) -> Conv5 (1x1, 4 caractéristiques)-> Softwamxloss

Après l'entraînement, j'ai supprimé la couche de perte

net.layers=net.layers(1 : end - 1);

J'ai le réseau qui ressemble à ça enter image description here

Je peux extraire les caractéristiques comme ça :

feats = vl_simplenn(net, im) ;
Feautre_L1(fea,:) = squeeze(feats(end).x);

De même, j'enlève 2 couches supplémentaires et j'extrais 256 caractéristiques de Conv4. Mais quand je passe à Conv3, la caractéristique de sortie est de 7x7x128. Je veux savoir comment je peux utiliser ces caractéristiques.
i) Faire un seul vecteur ii) Faire la moyenne des valeurs en profondeur ?

1voto

rafaspadilha Points 493

Transformer une carte en un vecteur de caractéristiques :

Dans votre cas, vous pourriez transformer la carte 7x7x128 en un tableau de 6727 dimensions. Si vous avez une carte intermédiaire, dont le tableau aplati a une dimensionnalité élevée (par exemple 100k-d), vous pouvez réduire ses dimensions (par une ACP, par exemple) car elle contient probablement beaucoup de redondance dans ses caractéristiques.

Combiner les résultats de vos couches :

Quant à la combinaison des fonctions, il existe de nombreuses façons de la réaliser. Une option que vous avez mentionnée consiste à créer un vecteur unique concaténant les sorties des couches souhaitées et à entraîner un classificateur par-dessus. Cette méthode est connue sous le nom de fusion précoce [1], où vous combinez vos caractéristiques pour obtenir une représentation unique avant la formation.

Une autre possibilité consiste à former un classificateur distinct pour chaque caractéristique (la sortie de chaque couche intermédiaire, dans votre cas) et ensuite, pour une image de test, vous combinez les sorties/scores de ces classificateurs distincts. Cette méthode est connue sous le nom de fusion tardive [1].

Extras :

Une exploration que vous pourriez effectuer est de rechercher quelles couches vous devriez sélectionner (soit pour la fusion précoce ou tardive) avant d'entraîner votre SVM. Ce [2] est un article intéressant, dans lequel les auteurs explorent quelque chose de similaire (en analysant les performances lors de l'utilisation de la sortie des dernières couches comme caractéristiques séparées). Autant que je m'en souvienne, leur étude s'inscrit dans le contexte de l'apprentissage par transfert (utilisation d'un modèle pré-entraîné dans un problème similaire pour aborder/résoudre une autre tâche).

[1] "Fusion précoce ou tardive dans l'analyse sémantique des vidéos"

[2] "Fonctions CNN sur étagère : une base de référence étonnante pour la reconnaissance".

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