{"notes":[{"id":"classic-cnns/zfnet","category":"classic-cnns","legacyPath":"","legacySlug":"","legacyPaths":[],"title":"ZFNet","subtitle":"Vue imprenable sur la boîte noire","author":"Z. Yuan","paperDate":"2013-11-12","publishedOn":"2025-09-06","world":"external/zfnet","paperTitle":"Visualizing and Understanding Convolutional Networks","paperUrl":"https://arxiv.org/abs/1311.2901","bibliography":{"title":"Visualizing and Understanding Convolutional Networks","authors":["Matthew D Zeiler","Rob Fergus"],"url":"https://arxiv.org/abs/1311.2901","pdfUrl":"https://arxiv.org/pdf/1311.2901v3","codeUrl":null,"preprint":{"id":"1311.2901","submittedOn":"2013-11-12","url":"https://arxiv.org/abs/1311.2901"},"publication":null,"citation":"@misc{classiccnnszfnet2013,\n  title = {{Visualizing and Understanding Convolutional Networks}},\n  author = {Matthew D Zeiler and Rob Fergus},\n  year = {2013},\n  eprint = {1311.2901},\n  archivePrefix = {arXiv},\n  url = {https://arxiv.org/abs/1311.2901}\n}\n","citationPath":"/content/papers/citations/classic-cnns/zfnet.6d4dd35e9f91.bib"},"thumbnail":{"src":"/content/papers/assets/6c45d745e8a2f4b60cc45bea1029353e303d5e3bbee1e62f438c71874fddf883.png","width":1200,"height":1329},"locale":"fr","path":"/content/papers/fr/classic-cnns/zfnet.40936a0995d6.md","headings":[{"id":"définir-le-problème","text":"Définir le problème","depth":2},{"id":"résoudre-le-problème","text":"Résoudre le problème","depth":2},{"id":"parcourir-le-réseau-convolutif-à-rebours","text":"Parcourir le réseau convolutif à rebours","depth":3},{"id":"lunpooling-doit-se-souvenir-de-lemplacement-du-maximum","text":"L'unpooling doit se souvenir de l'emplacement du maximum","depth":3},{"id":"le-modèle-observé","text":"Le modèle observé","depth":3},{"id":"ce-que-voit-chaque-couche","text":"Ce que voit chaque couche","depth":3},{"id":"corriger-larchitecture-daprès-ce-quon-voit","text":"Corriger l'architecture d'après ce qu'on voit","depth":3},{"id":"masquer-une-zone-et-observer-le-classifieur","text":"Masquer une zone et observer le classifieur","depth":3},{"id":"correspondances-entre-images","text":"Correspondances entre images","depth":3},{"id":"discussion","text":"Discussion","depth":2},{"id":"imagenet-2012","text":"ImageNet 2012","depth":3},{"id":"quelles-couches-pèsent-le-plus","text":"Quelles couches pèsent le plus ?","depth":3},{"id":"changer-de-jeu-de-données","text":"Changer de jeu de données","depth":3},{"id":"les-couches-hautes-sont-elles-toujours-plus-utiles","text":"Les couches hautes sont-elles toujours plus utiles ?","depth":3},{"id":"conclusion","text":"Conclusion","depth":2}],"anchorAliases":{},"guide":null,"relatedReading":[{"id":"classic-cnns/alexnet","relation":"referenced","topic":""},{"id":"classic-cnns/vgg","relation":"referenced","topic":""},{"id":"classic-cnns/resnet","relation":"referenced","topic":""}]},{"id":"classic-cnns/alexnet","category":"classic-cnns","legacyPath":"classic-cnns/1209-alexnet","legacySlug":"1209-alexnet","legacyPaths":[],"title":"AlexNet","subtitle":"L'essor des réseaux convolutifs","author":"Z. Yuan","paperDate":"2012","publishedOn":"2024-06-30","paperTitle":"ImageNet Classification with Deep Convolutional Neural Networks","paperUrl":"https://proceedings.neurips.cc/paper/2012/hash/c399862d3b9d6b76c8436e924a68c45b-Abstract.html","bibliography":{"title":"ImageNet Classification with Deep Convolutional Neural Networks","authors":["Alex Krizhevsky","Ilya Sutskever","Geoffrey E. Hinton"],"url":"https://proceedings.neurips.cc/paper/2012/hash/c399862d3b9d6b76c8436e924a68c45b-Abstract.html","pdfUrl":"https://proceedings.neurips.cc/paper_files/paper/2012/file/c399862d3b9d6b76c8436e924a68c45b-Paper.pdf","codeUrl":null,"preprint":null,"publication":{"venue":"NeurIPS (NIPS)","year":2012,"kind":"conference","url":"https://proceedings.neurips.cc/paper/2012/hash/c399862d3b9d6b76c8436e924a68c45b-Abstract.html"},"citation":"@inproceedings{classiccnnsalexnet2012,\n  title = {{ImageNet Classification with Deep Convolutional Neural Networks}},\n  author = {Alex Krizhevsky and Ilya Sutskever and Geoffrey E. Hinton},\n  year = {2012},\n  booktitle = {NeurIPS (NIPS)},\n  url = {https://proceedings.neurips.cc/paper/2012/hash/c399862d3b9d6b76c8436e924a68c45b-Abstract.html}\n}\n","citationPath":"/content/papers/citations/classic-cnns/alexnet.b38d2879f7bc.bib"},"thumbnail":{"src":"/content/papers/assets/87a5a48ff82989d4d78cc4d47a083f292fd7e249c1880c00ac4b31d8a042650d.jpg","width":1630,"height":570},"locale":"fr","path":"/content/papers/fr/classic-cnns/alexnet.cc99ecf266a8.md","headings":[{"id":"définition-du-problème","text":"Définition du problème","depth":2},{"id":"résolution-du-problème","text":"Résolution du problème","depth":2},{"id":"architecture-du-modèle","text":"Architecture du modèle","depth":3},{"id":"fonction-dactivation-relu","text":"Fonction d'activation ReLU","depth":3},{"id":"entraînement-sur-plusieurs-gpu","text":"Entraînement sur plusieurs GPU","depth":3},{"id":"local-response-normalization","text":"Local Response Normalization","depth":3},{"id":"max-pooling-avec-chevauchement","text":"Max pooling avec chevauchement","depth":3},{"id":"dropout","text":"Dropout","depth":3},{"id":"mise-en-œuvre-du-modèle","text":"Mise en œuvre du modèle","depth":3},{"id":"discussion","text":"Discussion","depth":2},{"id":"quapprend-le-réseau-convolutif-","text":"Qu'apprend le réseau convolutif ?","depth":3},{"id":"résultats-ilsvrc-2010","text":"Résultats ILSVRC-2010","depth":3},{"id":"résultats-ilsvrc-2012","text":"Résultats ILSVRC-2012","depth":3},{"id":"conclusion","text":"Conclusion","depth":2}],"anchorAliases":{},"guide":null,"relatedReading":[{"id":"classic-cnns/vgg","relation":"next","topic":"Entraîner des réseaux convolutifs plus profonds"}]},{"id":"classic-cnns/vgg","category":"classic-cnns","legacyPath":"classic-cnns/1409-vgg","legacySlug":"1409-vgg","legacyPaths":[],"title":"VGG","subtitle":"Très profond, et toujours plus profond","author":"Z. Yuan","paperDate":"2014-09-04","publishedOn":"2024-07-11","paperTitle":"Very Deep Convolutional Networks for Large-Scale Image Recognition","paperUrl":"https://arxiv.org/abs/1409.1556","bibliography":{"title":"Very Deep Convolutional Networks for Large-Scale Image Recognition","authors":["Karen Simonyan","Andrew Zisserman"],"url":"https://arxiv.org/abs/1409.1556","pdfUrl":"https://arxiv.org/pdf/1409.1556","codeUrl":null,"preprint":{"id":"1409.1556","submittedOn":"2014-09-04","url":"https://arxiv.org/abs/1409.1556"},"publication":{"venue":"ICLR","year":2015,"kind":"conference","url":"https://arxiv.org/pdf/1409.1556"},"citation":"@misc{classiccnnsvgg2014,\n  title = {{Very Deep Convolutional Networks for Large-Scale Image Recognition}},\n  author = {Karen Simonyan and Andrew Zisserman},\n  year = {2014},\n  eprint = {1409.1556},\n  archivePrefix = {arXiv},\n  url = {https://arxiv.org/abs/1409.1556}\n}\n","citationPath":"/content/papers/citations/classic-cnns/vgg.6d704fc68256.bib"},"thumbnail":{"src":"/content/papers/assets/f8c8263e4970f0d994107c8084552e778e2f8f3cee14e213551fb6b0942568c2.jpg","width":968,"height":980},"locale":"fr","path":"/content/papers/fr/classic-cnns/vgg.a9322b9a8d51.md","headings":[{"id":"définir-le-problème","text":"Définir le problème","depth":2},{"id":"résoudre-le-problème","text":"Résoudre le problème","depth":2},{"id":"architecture-du-réseau","text":"Architecture du réseau","depth":3},{"id":"détails-de-lentraînement","text":"Détails de l'entraînement","depth":3},{"id":"discussion","text":"Discussion","depth":2},{"id":"la-lrn-napporte-rien-ici","text":"La LRN n'apporte rien ici","depth":3},{"id":"résultats-sur-imagenet","text":"Résultats sur ImageNet","depth":3},{"id":"conclusion","text":"Conclusion","depth":2}],"anchorAliases":{},"guide":null,"relatedReading":[{"id":"classic-cnns/alexnet","relation":"background","topic":"Entraîner des réseaux convolutifs plus profonds"},{"id":"classic-cnns/resnet","relation":"next","topic":"Entraîner des réseaux convolutifs plus profonds"},{"id":"reparameterization/vanillanet","relation":"next","topic":"Simplifier la conception des réseaux convolutifs"}]},{"id":"classic-cnns/resnet","category":"classic-cnns","legacyPath":"classic-cnns/1512-resnet","legacySlug":"1512-resnet","legacyPaths":[],"title":"ResNet","subtitle":"Un réseau convolutif de 100 couches","author":"Z. Yuan","paperDate":"2015-12-10","publishedOn":"2024-08-08","paperTitle":"Deep Residual Learning for Image Recognition","paperUrl":"https://arxiv.org/abs/1512.03385","bibliography":{"title":"Deep Residual Learning for Image Recognition","authors":["Kaiming He","Xiangyu Zhang","Shaoqing Ren","Jian Sun"],"url":"https://arxiv.org/abs/1512.03385","pdfUrl":"https://arxiv.org/pdf/1512.03385","codeUrl":null,"preprint":{"id":"1512.03385","submittedOn":"2015-12-10","url":"https://arxiv.org/abs/1512.03385"},"publication":{"venue":"CVPR","year":2016,"kind":"conference","url":"https://doi.org/10.1109/cvpr.2016.90"},"citation":"@misc{classiccnnsresnet2015,\n  title = {{Deep Residual Learning for Image Recognition}},\n  author = {Kaiming He and Xiangyu Zhang and Shaoqing Ren and Jian Sun},\n  year = {2015},\n  eprint = {1512.03385},\n  archivePrefix = {arXiv},\n  url = {https://arxiv.org/abs/1512.03385}\n}\n","citationPath":"/content/papers/citations/classic-cnns/resnet.cf4014e8baae.bib"},"thumbnail":{"src":"/content/papers/assets/b8fe87fe757249ea6d7bb667fef3196754b9f80e28bf842a69b540ca94585d08.jpg","width":1224,"height":408},"locale":"fr","path":"/content/papers/fr/classic-cnns/resnet.2cc70ebed590.md","headings":[{"id":"définition-du-problème","text":"Définition du problème","depth":2},{"id":"résolution-du-problème","text":"Résolution du problème","depth":2},{"id":"quest-ce-quun-résidu-","text":"Qu'est-ce qu'un résidu ?","depth":3},{"id":"apprentissage-résiduel","text":"Apprentissage résiduel","depth":3},{"id":"blocs-résiduels","text":"Blocs résiduels","depth":3},{"id":"architecture-du-réseau","text":"Architecture du réseau","depth":3},{"id":"configuration-des-paramètres","text":"Configuration des paramètres","depth":3},{"id":"discussion","text":"Discussion","depth":2},{"id":"resnet-18-contre-resnet-34","text":"ResNet-18 contre ResNet-34","depth":3},{"id":"blocs-goulots-pour-les-réseaux-plus-profonds","text":"Blocs goulots pour les réseaux plus profonds","depth":3},{"id":"résultats-sur-imagenet","text":"Résultats sur ImageNet","depth":3},{"id":"conclusion","text":"Conclusion","depth":2}],"anchorAliases":{},"guide":null,"relatedReading":[{"id":"classic-cnns/vgg","relation":"background","topic":"Entraîner des réseaux convolutifs plus profonds"},{"id":"classic-cnns/densenet","relation":"next","topic":"Entraîner des réseaux convolutifs plus profonds"}]}],"text":"Au concours ImageNet 2012, AlexNet fait tomber le taux d'erreur top-5 à 16,4 % ; le deuxième en est à 26,2 %.\n\nPrès de dix points d'écart : du jour au lendemain, les réseaux convolutifs passent du rang de technique marginale à celui de méthode que tous les laboratoires veulent essayer.\n\nTout le monde s'aperçoit alors d'une chose embarrassante : le modèle est précis, mais personne ne sait dire pourquoi. Pour l'améliorer, on ne peut que changer le nombre de couches, retoucher la taille des filtres, entraîner une ou deux semaines, puis regarder si le score a progressé.\n\nEn novembre 2013, Matthew Zeiler et Rob Fergus, de l'université de New York, publient cet article ; dès l'introduction, ils qualifient cette situation de *trial-and-error*, d'essais et erreurs. Ils veulent d'abord comprendre le modèle, puis le modifier en fonction des problèmes observés.\n\n\n> [!TIP]\n> \n> On appelle souvent ce travail ZFNet, d'après les initiales des noms de ses deux auteurs. Si vous n'avez pas encore lu AlexNet, vous pouvez commencer par notre note :\n> \n> - **[[12.09] AlexNet : L'essor des réseaux convolutifs](/blog/papers/classic-cnns/alexnet)**\n\n\n## Définir le problème\n\nLa première couche d'un réseau convolutif se comprend sans peine. Ses filtres agissent directement sur les pixels : il suffit de dessiner leurs poids comme de petites images pour voir ce qu'ils cherchent, qu'il s'agisse de traits horizontaux, de traits obliques ou de taches d'une certaine couleur.\n\nÀ partir de la deuxième couche, cela ne marche plus. Les filtres de la deuxième couche agissent sur la sortie de la première ; dessiner leurs poids ne donne qu'un amas de nombres sans signification apparente. Plus on monte, plus ce que voit chaque unité est abstrait, et plus il est difficile de remonter jusqu'à l'image d'origine.\n\nPlusieurs approches existaient déjà. Erhan et al. effectuent une montée de gradient dans l'espace de l'image pour trouver l'entrée qui maximise l'activation d'une unité, mais le résultat dépend de l'initialisation et ne montre pas quelles variations l'unité tolère. Le et al. calculent numériquement la hessienne au voisinage de l'entrée optimale pour estimer les invariances, mais celles des couches hautes sont complexes, et une approximation quadratique ne les capture pas. Donahue et al., eux, cherchent directement les patchs d'image qui activent fortement les couches hautes ; reste qu'on ne voit pas quelles structures, dans ces patchs, sont déterminantes.\n\nLes auteurs veulent autre chose : partir d'une image réelle et d'une activation d'une couche intermédiaire, la projeter dans l'espace des pixels, et voir clairement **quelles structures de cette image** l'allument.\n\n## Résoudre le problème\n\n### Parcourir le réseau convolutif à rebours\n\nLes auteurs reprennent le Deconvolutional Network (deconvnet) qu'ils avaient eux-mêmes proposé en 2011. À l'origine, le deconvnet est un modèle d'apprentissage non supervisé ; ici, il n'est pas entraîné du tout et sert seulement de sonde, branchée à côté d'un réseau convolutif déjà entraîné.\n\n[![La moitié supérieure montre deux processus côte à côte. À droite, une couche du réseau convolutif, de bas en haut : l'entrée poolée de la couche inférieure passe par le filtrage convolutif F, la ReLU et le max pooling, et les positions des maxima sont notées switches. À gauche, une couche du deconvnet, de haut en bas : la reconstruction de la couche supérieure passe par l'unpooling, la ReLU et le filtrage par F transposé, ce qui donne la reconstruction de la couche inférieure. La moitié inférieure illustre l'unpooling : lors du pooling, on note la position du maximum dans chaque bloc de couleur ; lors de l'unpooling, on replace les valeurs de la couche supérieure à ces positions](/content/papers/assets/e846238b05c91faf3e65cc41d18380f105ef60fd65ec5ceaef64d428b9897b31.png)](/content/papers/assets/e846238b05c91faf3e65cc41d18380f105ef60fd65ec5ceaef64d428b9897b31.png)\n\n*Figure 1 de l'article, extraite de la [**page 3 du PDF v3**](https://arxiv.org/pdf/1311.2901v3#page=3). En haut à droite, une couche du réseau convolutif ; à gauche, la couche de deconvnet branchée à côté ; en bas, l'illustration de l'unpooling.*\n\nCommençons par la partie droite de la moitié supérieure : une couche du réseau convolutif se parcourt de bas en haut, avec dans l'ordre le filtrage ($F$), la ReLU et le max pooling. À gauche, le deconvnet descend de haut en bas et inverse ces trois étapes : unpooling, ReLU, puis filtrage avec les filtres transposés ($F^T$).\n\nLe mode d'emploi est le suivant :\n\n1. Envoyer une image dans le réseau convolutif et calculer les cartes de caractéristiques de chaque couche.\n2. Choisir une activation dans une couche donnée et mettre à zéro toutes les autres activations de cette même couche.\n3. Confier au deconvnet cette carte de caractéristiques réduite à une seule activation, et reconstruire couche par couche, vers le bas, jusqu'à l'espace des pixels.\n\nDes trois étapes inverses, c'est l'unpooling qui demande le plus d'explications.\n\n### L'unpooling doit se souvenir de l'emplacement du maximum\n\nLe max pooling perd de l'information : d'un bloc $2\\times2$, il ne garde que le maximum, et les trois autres nombres disparaissent. Cette opération n'a pas de fonction inverse.\n\nLa solution des auteurs consiste, pendant le calcul vers le haut, à noter au passage dans quelle case de chaque bloc se trouve le maximum ; ces positions s'appellent les switches. Essayons avec une carte de caractéristiques $4\\times4$ :\n\n```python\nimport numpy as np\n\nx = np.array([[1, 3, 2, 0],\n              [4, 2, 1, 5],\n              [0, 1, 7, 2],\n              [2, 6, 3, 1]])\n\npooled = np.zeros((2, 2), dtype=int)\nswitches = {}\nfor i in range(2):\n    for j in range(2):\n        block = x[2*i:2*i+2, 2*j:2*j+2]\n        r, c = np.unravel_index(block.argmax(), block.shape)\n        pooled[i, j] = block[r, c]\n        switches[(i, j)] = (2*i + r, 2*j + c)\n\nprint(pooled)\nprint(switches)\n```\n\n```text\n[[4 5]\n [6 7]]\n{(0, 0): (1, 0), (0, 1): (1, 3), (1, 0): (3, 1), (1, 1): (2, 2)}\n```\n\nAprès le pooling, il reste un $2\\times2$. `switches` indique de quelle case d'origine provient chaque sortie ; par exemple, le 7 en bas à droite vient de `(2, 2)`.\n\nSupposons que nous voulions suivre l'activation en bas à droite. Mettons les trois autres à zéro, puis remettons chaque valeur à sa place d'après les switches :\n\n```python\nreconstruction = np.array([[0, 0],\n                           [0, 9]])   # la couche supérieure ne garde que l'activation suivie\nunpooled = np.zeros((4, 4), dtype=int)\nfor (i, j), (r, c) in switches.items():\n    unpooled[r, c] = reconstruction[i, j]\nprint(unpooled)\n```\n\n```text\n[[0 0 0 0]\n [0 0 0 0]\n [0 0 9 0]\n [0 0 0 0]]\n```\n\nLe 9 reconstruit par la couche supérieure retombe à l'endroit où se trouvait le 7 ; toutes les autres positions valent zéro.\n\nVoilà l'unpooling : les positions notées pendant la montée permettent de remettre la reconstruction de la couche supérieure au bon endroit. Les switches sont propres à cette image d'entrée ; en poursuivant la reconstruction jusqu'en bas, on obtient donc un résultat qui ressemble à un petit morceau de l'image d'origine et qui conserve les structures ayant allumé cette activation.\n\nLes deux autres étapes sont plus directes :\n\n- **ReLU** : dans le réseau convolutif, les cartes de caractéristiques passent par une ReLU et sont toujours positives ou nulles ; la reconstruction de chaque couche repasse donc elle aussi par une ReLU pour rester positive ou nulle.\n- **Filtrage** : on utilise la transposée du même jeu de filtres, ce qui revient en pratique à retourner chaque filtre de haut en bas et de gauche à droite. Ce filtrage s'applique à la reconstruction passée par la ReLU, et non à la sortie d'origine de la couche inférieure.\n\n\n> [!NOTE]\n> \n> Le deconvnet utilisé ici ne résout aucun problème de déconvolution au sens mathématique : il réutilise simplement le même jeu de filtres, transposé. Dans les frameworks de deep learning actuels, `ConvTranspose2d` est lui aussi souvent appelé deconvolution ; il effectue de même une convolution transposée.\n\n\nLes auteurs précisent aussi que ces projections ne sont pas des échantillons générés par le modèle : aucun modèle génératif n'intervient dans le processus. Elles répondent à une seule question : quelles parties de cette entrée contribuent à l'activation choisie ?\n\n### Le modèle observé\n\nLe modèle observé ressemble beaucoup à AlexNet. Il compte huit couches : cinq couches de convolution et deux couches entièrement connectées, suivies d'un softmax. Pour se répartir sur deux GPU, AlexNet ne relie certaines couches de convolution qu'aux cartes de caractéristiques du même GPU ; ici, toutes les connexions sont rétablies, et le modèle est entraîné sur une seule GTX 580 pendant 70 époques, soit environ 12 jours.\n\nLa visualisation sert dès l'entraînement : dans la première couche, quelques filtres prennent des valeurs particulièrement élevées et dominent toute la couche (voir (a) dans la Figure 6, plus loin). La parade des auteurs consiste à borner la taille des filtres : dès que la valeur RMS d'un filtre de convolution dépasse $10^{-1}$, il est ramené à ce rayon. Selon eux, c'est particulièrement important dans la première couche, car les pixels d'entrée se situent à peu près dans $[-128, 128]$.\n\n### Ce que voit chaque couche\n\n[![La couche 1 montre plusieurs groupes de motifs de filtres. Les couches 2 à 5 comportent chacune de nombreuses grilles de 3×3 petites cases : à gauche, les projections du deconvnet sur fond gris ; à droite, les patchs correspondants de l'image d'origine, en couleur. La couche 2 montre surtout des contours et des taches de couleur, la couche 3 des textures comme des grillages ou du texte, la couche 4 des têtes de chien ou des pattes d'oiseau, la couche 5 des objets entiers comme des claviers ou des chiens](/content/papers/assets/6c45d745e8a2f4b60cc45bea1029353e303d5e3bbee1e62f438c71874fddf883.png)](/content/papers/assets/6c45d745e8a2f4b60cc45bea1029353e303d5e3bbee1e62f438c71874fddf883.png)\n\n*Figure 2 de l'article, extraite de la [**page 4 du PDF v3**](https://arxiv.org/pdf/1311.2901v3#page=4). Pour chaque carte de caractéristiques des couches 2 à 5, les 9 activations les plus fortes de l'ensemble de validation ; les petites images sur fond gris sont les projections du deconvnet, les petites images en couleur à côté sont les patchs correspondants de l'image d'origine.*\n\nCette figure se lit par paires : la projection sur fond gris ne dessine que les structures qui allument l'activation, tandis que le patch voisin montre l'image d'origine.\n\nLes auteurs décrivent ainsi chaque couche :\n\n- **Couche 2** : des coins, et des combinaisons de contours et de couleurs.\n- **Couche 3** : des invariances plus complexes ; elle capte des textures semblables, comme des grillages ou du texte.\n- **Couche 4** : les motifs commencent à dépendre de la classe, comme des têtes de chien ou des pattes d'oiseau.\n- **Couche 5** : des objets entiers, avec une forte tolérance aux variations de pose, comme des claviers ou des chiens.\n\nL'intérêt de cette lecture par paires est le plus évident pour la couche 5, ligne 1, colonne 2 : les 9 patchs semblent n'avoir rien en commun, mais la projection montre que cette carte de caractéristiques regarde en fait l'herbe de l'arrière-plan, et non l'objet au premier plan. À ne regarder que les patchs, on croirait que cette unité regarde n'importe quoi.\n\nLes auteurs suivent aussi l'évolution des caractéristiques pendant l'entraînement : les couches basses convergent en quelques époques, alors que les couches hautes ne prennent forme qu'à la 40e ou 50e époque. Ils en concluent qu'il faut entraîner le modèle jusqu'à convergence complète.\n\nUne autre série d'expériences mesure l'effet des translations, des changements d'échelle et des rotations sur les caractéristiques. Une petite transformation suffit à modifier fortement le vecteur de caractéristiques de la couche 1 ; à la couche 7, l'effet est bien plus faible, et à peu près linéaire pour la translation et le changement d'échelle. La sortie finale est stable vis-à-vis de la translation et du changement d'échelle, mais pas de la rotation, sauf si l'objet présente lui-même une symétrie de rotation.\n\n### Corriger l'architecture d'après ce qu'on voit\n\nC'est là que la visualisation se montre la plus utile. Les auteurs examinent les couches 1 et 2 d'AlexNet :\n\n[![Cinq visualisations de filtres. (a) est la couche 1 sans limite sur la taille des filtres, avec un carré particulièrement lumineux ; (b) est la couche 1 d'AlexNet, (c) la couche 1 modifiée ; (d) montre les projections de la couche 2 d'AlexNet, (e) celles de la couche 2 modifiée](/content/papers/assets/416e3ce07fbed24c5bda83322fd60820ab4098de4d461a714d914793f63f41a4.png)](/content/papers/assets/416e3ce07fbed24c5bda83322fd60820ab4098de4d461a714d914793f63f41a4.png)\n\n*Figure 6 de l'article, extraite de la [**page 7 du PDF v3**](https://arxiv.org/pdf/1311.2901v3#page=7). (a) La couche 1 sans limite sur la taille des filtres ; (b) la couche 1 d'AlexNet ; (c) la couche 1 modifiée ; (d) la couche 2 d'AlexNet ; (e) la couche 2 modifiée.*\n\nComparons d'abord (b) et (c). Les filtres de la première couche d'AlexNet mêlent des motifs à très haute et à très basse fréquence, avec peu de fréquences moyennes, ainsi que quelques filtres « morts » qui ne font presque rien. Comparons ensuite (d) et (e) : les projections de la couche 2 d'AlexNet présentent des traces de repliement de spectre (*aliasing*).\n\nLes auteurs attribuent le problème à la première couche : AlexNet y utilise des filtres $11\\times11$ avec un pas de 4 ; ils passent à des filtres $7\\times7$ avec un pas de 2.\n\nComment un pas peut-il provoquer du repliement ? Le pas, c'est l'intervalle d'échantillonnage. Essayons avec des rayures à une dimension : un motif qui se répète tous les 5 pixels, échantillonné une fois tous les 2 pixels, puis une fois tous les 4 pixels :\n\n```python\nimport numpy as np\n\nx = np.arange(40)\nstripe = np.round(np.cos(2 * np.pi * x / 5), 1)   # rayures qui se répètent tous les 5 pixels\n\nprint(\"pas de 2 :\", stripe[::2][:10])\nprint(\"pas de 4 :\", stripe[::4][:10])\n```\n\n```text\npas de 2 : [ 1.  -0.8  0.3  0.3 -0.8  1.  -0.8  0.3  0.3 -0.8]\npas de 4 : [ 1.   0.3 -0.8 -0.8  0.3  1.   0.3 -0.8 -0.8  0.3]\n```\n\nAvec un pas de 2, le signal bascule entre haut et bas à peu près à chaque échantillon ou tous les deux échantillons : ces variations rapides sont préservées. Avec un pas de 4, on obtient au contraire une ondulation douce qui accomplit un cycle tous les 5 échantillons, autrement dit une large rayure qui se répète tous les 20 pixels. L'original ne contient pas de telles rayures : c'est un faux motif, créé par un échantillonnage trop espacé.\n\nLes filtres de la première couche d'AlexNet contiennent déjà beaucoup de hautes fréquences ; si la carte de caractéristiques filtrée est ensuite échantillonnée avec un pas de 4, ces hautes fréquences peuvent se replier en faux motifs de basse fréquence, transmis à la couche suivante. Cet exemple à une dimension est une illustration propre à cette note ; l'article, lui, met le phénomène en évidence avec les projections : après la modification de l'architecture, la couche 2 (e) est bien plus nette, et l'on n'y voit plus de traces de repliement.\n\nPlus important encore, les résultats de classification s'améliorent aussi ; nous verrons les chiffres dans la discussion.\n\n\n> [!TIP]\n> \n> Dans les années suivantes, la configuration de la première couche n'est jamais revenue aux grands filtres à grand pas d'AlexNet. VGG passe entièrement au $3\\times3$ dès la première couche ; la première couche de ResNet utilise un $7\\times7$ avec un pas de 2, exactement comme ici.\n> \n> - **[[14.09] VGG : Très profond, et toujours plus profond](/blog/papers/classic-cnns/vgg)**\n> - **[[15.12] ResNet : Un réseau convolutif de 100 couches](/blog/papers/classic-cnns/resnet)**\n\n\n### Masquer une zone et observer le classifieur\n\nLes projections répondent à la question « que regarde cette caractéristique ? ». Les auteurs veulent aussi répondre à une autre question : le classifieur cherche-t-il vraiment l'objet, ou devine-t-il à partir de l'arrière-plan ?\n\nIls font glisser un carré gris sur l'image, case par case, pour en masquer différentes positions. Pour chaque position, ils enregistrent deux choses : l'activation totale de la carte de caractéristiques la plus forte de la couche 5, et la sortie du classifieur.\n\n[![Une rangée de cinq images. (a) montre un loulou de Poméranie tenant une balle de tennis dans la gueule, avec un carré gris de masquage sur l'image ; (b) est la carte de chaleur de l'activation totale de la carte de caractéristiques la plus forte de la couche 5 selon la position du masque, en bleu au niveau de la tête du chien ; (c) est la projection de cette carte de caractéristiques ; (d) est la carte de chaleur de la probabilité de la bonne classe, la plus basse au niveau de la tête du chien ; (e) donne la classe la plus probable pour chaque position du masque, le plus souvent loulou de Poméranie ; près de la tête du chien, quelques cases deviennent balle de tennis, pékinois ou keeshond](/content/papers/assets/a17219e0ee699c0d36ceeb892c3a304fe106143afa91432c0caaaaf91fefbb8b.png)](/content/papers/assets/a17219e0ee699c0d36ceeb892c3a304fe106143afa91432c0caaaaf91fefbb8b.png)\n\n*Figure 7 de l'article (première ligne), extraite de la [**page 7 du PDF v3**](https://arxiv.org/pdf/1311.2901v3#page=7). (a) L'image d'entrée et le carré gris de masquage ; (b) l'effet de la position du masque sur l'activation totale de la carte de caractéristiques la plus forte de la couche 5 ; (c) la projection de cette carte de caractéristiques ; (d) la probabilité de la bonne classe ; (e) la classe la plus probable pour chaque position du masque.*\n\nC'est un loulou de Poméranie qui tient une balle de tennis dans la gueule. Dans (b) comme dans (d), les zones bleues tombent sur la tête du chien : quand on la masque, la caractéristique la plus forte de la couche 5 s'affaiblit, et la probabilité de « loulou de Poméranie » baisse nettement. (e) est plus intéressant encore : pour la plupart des positions, la prédiction reste loulou de Poméranie ; mais quand la tête du chien est masquée et que la balle reste visible, le modèle change d'avis et répond « balle de tennis ».\n\nLes deux autres lignes de la même figure rappellent que la caractéristique la plus forte et l'indice sur lequel s'appuie le classifieur ne se trouvent pas forcément au même endroit. Dans la deuxième ligne, une voiture de course : la caractéristique la plus forte de la couche 5 se trouve sur le texte de la carrosserie, alors que le classifieur est le plus sensible aux roues. Dans la troisième ligne, la scène contient plusieurs objets : la caractéristique la plus forte se porte sur un visage humain, mais le classifieur est le plus sensible au chien ; selon les auteurs, c'est parce que le classifieur utilise plusieurs cartes de caractéristiques à la fois.\n\n### Correspondances entre images\n\nLa dernière analyse est moins souvent citée. Les méthodes de reconnaissance classiques disposent souvent d'un mécanisme explicite de correspondance, qui sait par exemple où se trouvent les yeux et le nez l'un par rapport à l'autre sur un visage. Les modèles profonds n'ont rien de tel ; les auteurs veulent savoir s'ils établissent implicitement des correspondances en interne.\n\nIls prennent 5 photos de chiens vus de face, masquent la même partie sur chaque image (par exemple l'œil gauche à chaque fois), calculent la différence des caractéristiques avant et après le masquage, puis vérifient si le signe de ces différences concorde entre les 5 images. L'indicateur est la distance de Hamming entre les signes des différences, prise deux à deux ; plus elle est basse, plus les changements provoqués par le masquage d'une même partie sont cohérents :\n\n| Position masquée | Couche 5 | Couche 7 |\n| --- | ---: | ---: |\n| Œil droit | 0,067 ± 0,007 | 0,069 ± 0,015 |\n| Œil gauche | 0,069 ± 0,007 | 0,068 ± 0,013 |\n| Nez | 0,079 ± 0,017 | 0,069 ± 0,011 |\n| Position aléatoire | 0,107 ± 0,017 | 0,073 ± 0,014 |\n\n*Tableau : chiffres tirés de la Table 1 de l'article.*\n\nÀ la couche 5, les yeux et le nez obtiennent des scores plus bas que les positions aléatoires ; les auteurs y voient une certaine forme de correspondance entre parties établie par le modèle dans cette couche. À la couche 7, les scores sont proches les uns des autres ; les auteurs supposent que les couches hautes sont occupées à distinguer les races de chiens.\n\n## Discussion\n\n### ImageNet 2012\n\nLes auteurs commencent par reproduire les résultats avec l'architecture d'origine d'AlexNet : leur taux d'erreur sur l'ensemble de validation s'écarte de moins de 0,1 % de celui de l'article d'origine. Ils passent ensuite à l'architecture modifiée :\n\n| Modèle | Top-1 validation | Top-5 validation | Top-5 test |\n| --- | ---: | ---: | ---: |\n| AlexNet, 1 modèle | 40,7 | 18,2 | — |\n| AlexNet, 5 modèles | 38,1 | 16,4 | 16,4 |\n| Cet article, 1 modèle | 38,4 | 16,5 | — |\n| Cet article, 5 modèles | 36,7 | 15,3 | 15,3 |\n| Cet article, 6 modèles (dont une version aux couches intermédiaires élargies) | 36,0 | 14,7 | 14,8 |\n\n*Tableau : taux d'erreur (%) extraits de la Table 2 de l'article ; les versions d'AlexNet entraînées à la fois sur les données de 2011 et de 2012 sont omises.*\n\nPour un modèle unique, le taux d'erreur top-5 en validation passe de 18,2 % à 16,5 % ; en combinant 6 modèles, le taux d'erreur top-5 en test est de 14,8 %. Les auteurs signalent aussi en note de bas de page que ce résultat a déjà été dépassé par des équipes participant à l'ILSVRC 2013, la même année.\n\n### Quelles couches pèsent le plus ?\n\nLes auteurs retirent ensuite des couches entières de l'architecture d'AlexNet et réentraînent depuis zéro :\n\n| Modification | Top-1 entraînement | Top-1 validation | Top-5 validation |\n| --- | ---: | ---: | ---: |\n| Architecture d'origine (reproduite) | 35,1 | 40,5 | 18,1 |\n| Sans les couches 3 et 4 | 41,8 | 45,4 | 22,1 |\n| Sans la couche 7 | 27,4 | 40,0 | 18,4 |\n| Sans les couches 6 et 7 | 27,4 | 44,8 | 22,4 |\n| Sans les couches 3, 4, 6 et 7 | 71,1 | 71,3 | 50,1 |\n\n*Tableau : taux d'erreur (%) extraits de la moitié supérieure de la Table 3 de l'article.*\n\nLes couches entièrement connectées 6 et 7 contiennent la plupart des paramètres du modèle ; sans elles, le taux d'erreur top-1 en validation passe de 40,5 % à 44,8 %. Sans les deux couches de convolution du milieu, il monte à 45,4 %. Prise isolément, chacune de ces suppressions coûte moins qu'on ne l'attendrait. Mais si l'on retire les deux groupes à la fois, il ne reste que 4 couches, et le taux d'erreur grimpe d'un coup à 71,3 %. Les auteurs en concluent que ce qui compte, c'est que le réseau ait une profondeur suffisante, et non telle ou telle portion de couches en particulier.\n\nLa même expérience sur l'architecture de ZFNet donne ceci : agrandir ou réduire les couches entièrement connectées change peu de chose ; porter le nombre de cartes de caractéristiques des couches 3, 4 et 5 à 512, 1024 et 512 fait baisser le taux d'erreur top-1 en validation de 38,4 % à 37,5 %. Si l'on porte en plus les couches entièrement connectées à 8192 unités, l'erreur d'entraînement descend à 10,0 %, mais l'erreur de validation remonte à 38,3 % : le surapprentissage commence.\n\n### Changer de jeu de données\n\nLes auteurs veulent aussi savoir si les caractéristiques apprises sur ImageNet se transfèrent à d'autres jeux de données. Ils figent les couches 1 à 7 et ne réentraînent que le softmax final sur le nouveau jeu de données. Pour éviter que des données de test ne se glissent dans l'ensemble d'entraînement, ils repèrent d'abord les images en double avec ImageNet, 44 pour Caltech-101 et 243 pour Caltech-256, les retirent de l'ensemble d'entraînement d'ImageNet, puis réentraînent le modèle ImageNet.\n\n- **Caltech-101** (30 images d'entraînement par classe) : 86,5 %, contre 81,4 % pour le meilleur résultat de l'époque, celui de Bo et al. Le même réseau entraîné depuis zéro sur Caltech-101 n'atteint que 46,5 %.\n- **Caltech-256** (60 images par classe) : 74,2 %, contre 55,2 %. Avec seulement 6 images d'entraînement par classe, le modèle dépasse déjà le résultat obtenu par Bo et al. avec 60.\n- **PASCAL VOC 2012** : 79,0 % en moyenne, 3,2 points de pourcentage sous la meilleure méthode de l'époque, mais devant elle sur 5 classes. Les images de PASCAL sont pour la plupart des scènes complètes contenant plusieurs objets, alors que le modèle ne peut produire qu'une seule classe ; les auteurs y voient l'une des raisons de ce désavantage.\n\nÀ la même période, les travaux de Donahue et al. étudiaient eux aussi la capacité de généralisation des caractéristiques convolutives. Les auteurs en tirent une question : les benchmarks dont l'ensemble d'entraînement compte moins de dix mille images permettent-ils encore de bien comparer les méthodes ?\n\n### Les couches hautes sont-elles toujours plus utiles ?\n\nLa Table 7 de l'article tronque le modèle préentraîné à différentes couches et y branche un SVM linéaire ou un softmax :\n\n- **Caltech-101** : 44,8 % avec la couche 1 seule, puis 66,2 %, 72,3 % et 76,6 % ; la couche 5 atteint 86,2 % et la couche 7, 85,5 %.\n- **Caltech-256** : la précision monte régulièrement, de 24,6 % pour la couche 1 jusqu'à 71,7 % pour la couche 7.\n\nDans l'ensemble, plus la couche est haute, meilleur est le résultat. Sur Caltech-101, les couches 5 et 7 sont proches ; sur Caltech-256, la progression se poursuit jusqu'à la couche 7.\n\n## Conclusion\n\nCet article fait deux choses : projeter les activations des couches intermédiaires dans l'espace des pixels avec un deconvnet, puis utiliser ces images pour diagnostiquer AlexNet. Le repliement de spectre et les filtres morts de la première couche ont d'abord été repérés sur les images, et les résultats de classification se sont améliorés après correction ; la visualisation devient ici un outil d'ajustement de l'architecture.\n\nAu concours de classification de l'ILSVRC 2013, la même année, Zeiler et Fergus participent sous le nom « ZF » et se classent troisièmes avec un taux d'erreur top-5 de 13,5 % ; le vainqueur est Clarifai, l'équipe menée par Zeiler, avec 11,7 % sans données supplémentaires.\n\nLa méthode de visualisation elle-même a ensuite été mise à l'épreuve. En 2014, dans [Striving for Simplicity](https://arxiv.org/abs/1412.6806), Springenberg et al. combinent le deconvnet et la rétropropagation ordinaire pour obtenir la guided backpropagation. En 2018, dans [Sanity Checks for Saliency Maps](https://arxiv.org/abs/1810.03292), Adebayo et al. constatent qu'après avoir mélangé aléatoirement les poids du modèle, les images produites par la guided backpropagation ne changent presque pas et ressemblent beaucoup à une simple détection de contours. Aussi nettes que soient les projections, il faut vérifier par ailleurs qu'elles changent bien avec le modèle.\n\nAvec le recul, l'effet des modifications d'architecture est attesté par les résultats de classification ; quant à la fidélité réelle de chaque projection, la question a été laissée aux travaux qui ont suivi.\n","imageSizes":{"/content/papers/assets/e846238b05c91faf3e65cc41d18380f105ef60fd65ec5ceaef64d428b9897b31.png":{"width":696,"height":677},"/content/papers/assets/6c45d745e8a2f4b60cc45bea1029353e303d5e3bbee1e62f438c71874fddf883.png":{"width":1200,"height":1329},"/content/papers/assets/416e3ce07fbed24c5bda83322fd60820ab4098de4d461a714d914793f63f41a4.png":{"width":1280,"height":400},"/content/papers/assets/a17219e0ee699c0d36ceeb892c3a304fe106143afa91432c0caaaaf91fefbb8b.png":{"width":1397,"height":292}}}
