0 votes
par dans Séquence 2
Les réseaux de neurones convolutionnels sont montrés comme étant plus adaptés pour de grandes images car nécessitant moins de paramètres.

Pourtant, à la fin d'un CNN il y a bien une ou plusieurs couches denses.

Dans le Notebook MNIST 2, quand on affiche le résumé du modèle, on voit à l'étape "flatten" qu'on obtient une image de 400 pixels en tout, qu'on utilise en entrée de la partie "dense".

De base les images faisaient 28 * 28 = 784 pixels. On a quasiment divisé par deux la taille des images en entrée de la partie dense et c'est bien mais pas tant que ça je trouve. Et c'est vraiment parce qu'on a décidé d'avoir un padding "valid" car avec un padding "same" on aurait à la fin 16 couches d'images 7*7 soit... 784 pixels à nouveau.

Mais du coup on a pas diminué le nombre de paramètres ! On en a même plus.

Ma question porte sur le cas général, avec vraiment de grandes images et la nécessité de conserver un nombre de paramètres bas.

Comment fait-on ?

J'ai l'impression que là on a un peu un cas particulier car si j'ai bien compris, le pooling divise la taille des images par 4, et chaque nouvelle "couche" convolutionnelle double le nombre de kernels et donc de "canaux" à l'image.

On utilise de base 8 kernels donc on a après cette étape 8 fois plus de pixels.

Pooling on divise par 4 : on a 2 fois plus de pixels.

On double le nombre de kernels : on a 4 fois plus de pixels

Pooling on divise par 4 : on a autant de pixels qu'au départ....

Est ce que dans le cas général on conserve le nombre de kernels de départ, mais on rajoute plus de couches convolutionnels (et donc d'étapes de pooling (qui divisent par 4) alors que les kernels ne font que doubler à chaque étape) pour finalement diminuer le nombre de pixels en entrée de la partie dense ?

Lorsque l'on souhaite traiter des images sensiblement plus grandes, est-ce que l'on diminue grandement la taille (via des pooling) mais sans compenser totalement avec la "profondeur" (en ajoutant 2 fois plus de neurones convolutionnels) ?

1 Réponse

+1 vote
par Vétéran du GPU 🐋 (48.7k points)
sélectionné par
 
Meilleure réponse

Pour analyser les images, on a besoin d'avoir plusieurs couches sinon on ne peut pas comprendre les patterns plus complexes. Là tu compares la dernière couche (dense du coup) d'un CNN avec un DNN. Sauf que le CNN n'aura en général qu'une seule couche dense (ou du moins pas beaucoup). Pour avoir une certaine capacité, le réseau aura besoin de plusieurs couches, voire beaucoup selon la complexité et la taille des images. C'est là l'avantage du CNN par rapport au DNN. La couche convolutive aura peu de paramètres par rapport à une couche dense pour une capacité d'apprentissage similaire. Un CNN au fond c'est exactement la même chose qu'un DNN sauf qu'on a mis en commun certains poids et fixés d'autres à 0. Donc on a bien moins de paramètres dans un CNN que dans un réseau dense.

Regardez par exemple ce que fait VGG 16 : datacorner.fr/vgg-transfer-learning/

C'est un des modèles les plus performants (92% sur imagenet) avec 138M de paramètres. Une grosse partie des paramètres provient des dernières couches denses, mais elles travaillent avec les caractéristiques trouvées par les couches convolutives. Il ne serait pas possible d'obtenir un réseau similaire avec des couches denses car on aurait une explosion du nombre de paramètres et il faudrait fortement diminuer le nombre de couches.

...