{"notes":[{"id":"classic-cnns/nin","category":"classic-cnns","legacyPath":"","legacySlug":"","legacyPaths":[],"title":"NiN","subtitle":"Le 1×1 en germe","author":"Z. Yuan","paperDate":"2013-12-16","publishedOn":"2025-09-24","world":"external/network-in-network","paperTitle":"Network In Network","paperUrl":"https://arxiv.org/abs/1312.4400","bibliography":{"title":"Network In Network","authors":["Min Lin","Qiang Chen","Shuicheng Yan"],"url":"https://arxiv.org/abs/1312.4400","pdfUrl":"https://arxiv.org/pdf/1312.4400v3","codeUrl":null,"preprint":{"id":"1312.4400","submittedOn":"2013-12-16","url":"https://arxiv.org/abs/1312.4400"},"publication":null,"citation":"@misc{classiccnnsnin2013,\n  title = {{Network In Network}},\n  author = {Min Lin and Qiang Chen and Shuicheng Yan},\n  year = {2013},\n  eprint = {1312.4400},\n  archivePrefix = {arXiv},\n  url = {https://arxiv.org/abs/1312.4400}\n}\n","citationPath":"/content/papers/citations/classic-cnns/nin.db58639ac47c.bib"},"thumbnail":{"src":"/content/papers/assets/8024fc245eb852a2c0cd34b59c18c680b92766c33d621b934dbf102c1cacda13.png","width":896,"height":330},"locale":"fr","path":"/content/papers/fr/classic-cnns/nin.15718dc1a267.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":"un-petit-mlp-sur-chaque-patch","text":"Un petit MLP sur chaque patch","depth":3},{"id":"remplacer-les-couches-entièrement-connectées-par-une-moyenne","text":"Remplacer les couches entièrement connectées par une moyenne","depth":3},{"id":"le-réseau-complet","text":"Le réseau complet","depth":3},{"id":"discussion","text":"Discussion","depth":2},{"id":"cifar-10-et-cifar-100","text":"CIFAR-10 et CIFAR-100","depth":3},{"id":"svhn-et-mnist","text":"SVHN et MNIST","depth":3},{"id":"le-pooling-moyen-global-régularise-t-il-vraiment","text":"Le pooling moyen global régularise-t-il vraiment ?","depth":3},{"id":"la-dernière-couche-devient-elle-vraiment-une-carte-de-confiance","text":"La dernière couche devient-elle vraiment une carte de confiance ?","depth":3},{"id":"conclusion","text":"Conclusion","depth":2}],"anchorAliases":{},"guide":null,"relatedReading":[{"id":"classic-cnns/inception-v1","relation":"referenced","topic":""},{"id":"classic-cnns/resnet","relation":"referenced","topic":""},{"id":"classic-cnns/cam","relation":"referenced","topic":""}]},{"id":"classic-cnns/inception-v1","category":"classic-cnns","legacyPath":"classic-cnns/1409-inception-v1","legacySlug":"1409-inception-v1","legacyPaths":[],"title":"GoogLeNet","subtitle":"Ou encore Inception-V1","author":"Z. Yuan","paperDate":"2014-09-17","publishedOn":"2024-09-22","paperTitle":"Going Deeper with Convolutions","paperUrl":"https://arxiv.org/abs/1409.4842","bibliography":{"title":"Going Deeper with Convolutions","authors":["Christian Szegedy","Wei Liu","Yangqing Jia","Pierre Sermanet","Scott Reed","Dragomir Anguelov","Dumitru Erhan","Vincent Vanhoucke","Andrew Rabinovich"],"url":"https://arxiv.org/abs/1409.4842","pdfUrl":"https://arxiv.org/pdf/1409.4842","codeUrl":null,"preprint":{"id":"1409.4842","submittedOn":"2014-09-17","url":"https://arxiv.org/abs/1409.4842"},"publication":{"venue":"CVPR","year":2015,"kind":"conference","url":"https://doi.org/10.1109/cvpr.2015.7298594"},"citation":"@misc{classiccnnsinceptionv12014,\n  title = {{Going Deeper with Convolutions}},\n  author = {Christian Szegedy and Wei Liu and Yangqing Jia and Pierre Sermanet and Scott Reed and Dragomir Anguelov and Dumitru Erhan and Vincent Vanhoucke and Andrew Rabinovich},\n  year = {2014},\n  eprint = {1409.4842},\n  archivePrefix = {arXiv},\n  url = {https://arxiv.org/abs/1409.4842}\n}\n","citationPath":"/content/papers/citations/classic-cnns/inception-v1.3d20e0e32bcd.bib"},"thumbnail":{"src":"/content/papers/assets/254b970b1374c24267b60c2d684338760e9ba8b10dad761a5fa15f1bb8bcf6ef.jpg","width":1330,"height":394},"locale":"fr","path":"/content/papers/fr/classic-cnns/inception-v1.8e21e48f0201.md","headings":[{"id":"résoudre-le-problème","text":"Résoudre le problème","depth":2},{"id":"le-module-inception","text":"Le module Inception","depth":3},{"id":"configuration-des-paramètres","text":"Configuration des paramètres","depth":3},{"id":"architecture-du-modèle","text":"Architecture du modèle","depth":3},{"id":"discussion","text":"Discussion","depth":2},{"id":"résultats-à-lilsvrc-2014","text":"Résultats à l'ILSVRC 2014","depth":3},{"id":"conclusion","text":"Conclusion","depth":2}],"anchorAliases":{},"guide":null,"relatedReading":[{"id":"classic-cnns/resnext","relation":"comparison","topic":"Branches, convolutions groupées et réutilisation des caractéristiques"},{"id":"classic-cnns/cspnet","relation":"comparison","topic":"Branches, convolutions groupées et réutilisation des caractéristiques"}]},{"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"}]},{"id":"classic-cnns/cam","category":"classic-cnns","legacyPath":"","legacySlug":"","legacyPaths":[],"title":"CAM","subtitle":"Où regarde le modèle ?","author":"Z. Yuan","paperDate":"2015-12-14","publishedOn":"2026-01-05","world":"external/cam","paperTitle":"Learning Deep Features for Discriminative Localization","paperUrl":"https://arxiv.org/abs/1512.04150","bibliography":{"title":"Learning Deep Features for Discriminative Localization","authors":["Bolei Zhou","Aditya Khosla","Agata Lapedriza","Aude Oliva","Antonio Torralba"],"url":"https://arxiv.org/abs/1512.04150","pdfUrl":"https://arxiv.org/pdf/1512.04150v1","codeUrl":null,"preprint":{"id":"1512.04150","submittedOn":"2015-12-14","url":"https://arxiv.org/abs/1512.04150"},"publication":null,"citation":"@misc{classiccnnscam2015,\n  title = {{Learning Deep Features for Discriminative Localization}},\n  author = {Bolei Zhou and Aditya Khosla and Agata Lapedriza and Aude Oliva and Antonio Torralba},\n  year = {2015},\n  eprint = {1512.04150},\n  archivePrefix = {arXiv},\n  url = {https://arxiv.org/abs/1512.04150}\n}\n","citationPath":"/content/papers/citations/classic-cnns/cam.2ce837236f9d.bib"},"thumbnail":{"src":"/content/papers/assets/c3c6af7f1943634784331ca03a55efc3e68a7714d936d953a14f11b0828d9cf8.png","width":1372,"height":615},"locale":"fr","path":"/content/papers/fr/classic-cnns/cam.dc07c0da5f72.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":"redécomposer-le-score-dans-lespace","text":"Redécomposer le score dans l'espace","depth":3},{"id":"moyenne-ou-maximum-quelle-différence","text":"Moyenne ou maximum : quelle différence ?","depth":3},{"id":"augmenter-la-résolution-de-la-dernière-couche","text":"Augmenter la résolution de la dernière couche","depth":3},{"id":"de-la-carte-de-chaleur-à-la-boîte","text":"De la carte de chaleur à la boîte","depth":3},{"id":"discussion","text":"Discussion","depth":2},{"id":"sans-couches-entièrement-connectées-combien-perd-la-classification","text":"Sans couches entièrement connectées, combien perd la classification ?","depth":3},{"id":"localisation-faiblement-supervisée","text":"Localisation faiblement supervisée","depth":3},{"id":"vers-dautres-tâches","text":"Vers d'autres tâches","depth":3},{"id":"conclusion","text":"Conclusion","depth":2}],"anchorAliases":{},"guide":null,"relatedReading":[{"id":"classic-cnns/nin","relation":"referenced","topic":""},{"id":"classic-cnns/zfnet","relation":"referenced","topic":""},{"id":"classic-cnns/resnet","relation":"referenced","topic":""}]}],"text":"Au concours de classification ImageNet 2013, l'équipe de l'université nationale de Singapour (NUS) termine deuxième ; Min Lin et Qiang Chen en font partie.\n\nEn décembre de la même année, tous deux publient cet article avec Shuicheng Yan ; il paraîtra ensuite à l'ICLR 2014. L'article lui-même ne contient aucune expérience sur ImageNet et se limite à de petits jeux de données comme CIFAR, SVHN et MNIST. Pourtant, les deux pièces qu'il a laissées se retrouvent partout dans les réseaux convolutifs des années suivantes : la convolution $1\\times1$ et le pooling moyen global.\n\nCes deux pièces naissent d'une même interrogation : les filtres d'un réseau convolutif ne sont-ils pas trop simples ?\n\n## Définir le problème\n\nVoyons d'abord ce que fait une couche de convolution ordinaire. Avec une ReLU, par exemple, la sortie de la $k$-ième carte de caractéristiques à la position $(i, j)$ s'écrit :\n\n$$\nf_{i,j,k} = \\max(w_k^T x_{i,j},\\ 0)\n$$\n\n$x_{i,j}$ est le patch d'entrée centré en $(i, j)$, et $w_k$ le $k$-ième filtre. Autrement dit, chaque filtre calcule un produit scalaire linéaire sur le patch, puis applique une ReLU. Les auteurs appellent cela un modèle linéaire généralisé (GLM).\n\nCe qu'un modèle linéaire peut séparer est limité. Supposons qu'un filtre cherche à détecter des « contours obliques » : si toutes les apparences de ces contours, sous différents éclairages et à différentes épaisseurs, tombent justement du même côté d'un hyperplan, un seul filtre suffit. Mais les multiples apparences d'un même concept sont souvent dispersées sur une variété courbe, qu'un hyperplan ne tranche pas proprement.\n\nComment fait un réseau convolutif ordinaire ? Il ajoute des filtres, chacun chargé d'une apparence. Les auteurs soulignent que cela reporte la charge sur la couche suivante : celle-ci doit tenir compte de toutes les combinaisons d'apparences de la couche précédente pour assembler des concepts de plus haut niveau.\n\nLes réseaux maxout, publiés peu avant, avaient fait un pas dans cette direction. Ils prennent le maximum sur plusieurs cartes de caractéristiques affines :\n\n$$\nf_{i,j,k} = \\max_m\\,(w_{k_m}^T x_{i,j})\n$$\n\nLe maximum de plusieurs fonctions linéaires donne une fonction convexe linéaire par morceaux, capable de séparer des concepts situés dans un ensemble convexe. Les auteurs estiment toutefois que « le concept se trouve dans un ensemble convexe » reste une hypothèse qui ne tient pas toujours.\n\nPourrait-on alors placer sur chaque patch local un modèle libre de cette hypothèse, capable d'approcher des fonctions générales ?\n\nL'extrémité du réseau convolutif pose un autre problème. Les dernières couches sont généralement entièrement connectées ; pour les auteurs, elles ressemblent à une boîte noire, et l'on voit mal comment l'information de classe redescend jusqu'aux couches de convolution. Les couches entièrement connectées sont aussi sujettes au surapprentissage et doivent s'appuyer sur le dropout pour tenir.\n\n## Résoudre le problème\n\n### Un petit MLP sur chaque patch\n\nLa réponse des auteurs consiste à remplacer le filtre linéaire par un petit perceptron multicouche (MLP), qui glisse lui aussi sur chaque position de l'entrée, avec les mêmes poids partagés par toutes les positions. Cette couche s'appelle mlpconv :\n\n[![Deux schémas côte à côte. (a) Couche de convolution linéaire : un patch local de l'entrée passe par un filtre linéaire et donne un point de la carte de caractéristiques de sortie. (b) Couche mlpconv : le même patch local passe d'abord par un petit réseau à deux couches entièrement connectées, puis donne un point de la sortie](/content/papers/assets/8024fc245eb852a2c0cd34b59c18c680b92766c33d621b934dbf102c1cacda13.png)](/content/papers/assets/8024fc245eb852a2c0cd34b59c18c680b92766c33d621b934dbf102c1cacda13.png)\n\n*Figure 1 de l'article, extraite de la [**page 2 du PDF v3**](https://arxiv.org/pdf/1312.4400v3#page=2). (a) Couche de convolution linéaire ; (b) couche mlpconv, où un petit MLP s'ajoute dans le patch.*\n\nLorsque le MLP compte $n$ couches, le calcul de mlpconv s'écrit :\n\n$$\n\\begin{aligned}\nf^{1}_{i,j,k_1} &= \\max\\left({w^{1}_{k_1}}^T x_{i,j} + b_{k_1},\\ 0\\right) \\\\\n&\\ \\ \\vdots \\\\\nf^{n}_{i,j,k_n} &= \\max\\left({w^{n}_{k_n}}^T f^{n-1}_{i,j} + b_{k_n},\\ 0\\right)\n\\end{aligned}\n$$\n\nLa première ligne est exactement une convolution ordinaire : un produit scalaire sur tout le patch $x_{i,j}$. À partir de la deuxième ligne, l'entrée devient la sortie de la couche précédente à **la même position** $(i, j)$, $f^{n-1}_{i,j}$ : on ne regarde plus que les valeurs de tous les canaux à cette position.\n\nNe regarder qu'une position et combiner tous ses canaux avec des poids, c'est précisément une convolution $1\\times1$. Les auteurs écrivent d'ailleurs explicitement cette équivalence : une couche mlpconv équivaut à une convolution ordinaire suivie de plusieurs convolutions $1\\times1$.\n\nVérifions-le avec PyTorch. L'entrée est une carte de caractéristiques $5\\times5$ à 2 canaux ; le petit MLP reçoit les $2\\times3\\times3=18$ nombres de chaque patch $3\\times3$ aplati, et passe par deux couches, 18 → 4 → 3 :\n\n```python\nimport torch\nimport torch.nn.functional as F\n\ntorch.manual_seed(0)\nx = torch.randn(1, 2, 5, 5)            # 1 image, 2 canaux, 5×5\n\n# Petit MLP : chaque patch 3×3 est aplati en 2×3×3 = 18 nombres, puis passe par 18 → 4 → 3\nw1, b1 = torch.randn(4, 18), torch.randn(4)\nw2, b2 = torch.randn(3, 4), torch.randn(3)\n\n# Méthode 1 : faire glisser le MLP sur chaque patch 3×3\npatches = F.unfold(x, kernel_size=3)            # [1, 18, 9] : 9 positions, 18 dimensions chacune\nh = F.relu(w1 @ patches + b1[:, None])          # [1, 4, 9]\ny_mlp = F.relu(w2 @ h + b2[:, None]).reshape(1, 3, 3, 3)\n\n# Méthode 2 : convolution 3×3, suivie d'une convolution 1×1\nh = F.relu(F.conv2d(x, w1.reshape(4, 2, 3, 3), b1))\ny_conv = F.relu(F.conv2d(h, w2.reshape(3, 4, 1, 1), b2))\n\nprint(y_mlp.shape, y_conv.shape)\nprint(\"écart maximal :\", (y_mlp - y_conv).abs().max().item())\n```\n\n```text\ntorch.Size([1, 3, 3, 3]) torch.Size([1, 3, 3, 3])\nécart maximal : 4.76837158203125e-07\n```\n\nLes deux méthodes donnent des sorties de même forme, et l'écart se réduit à une erreur d'arrondi en virgule flottante.\n\nLa méthode 1 colle davantage à l'idée des auteurs : à chaque position, un petit réseau juge si « tel concept est présent ici ». La méthode 2 montre l'implémentation : une couche de convolution $3\\times3$ regarde d'abord tout le patch, puis les convolutions $1\\times1$ ne font que mélanger les canaux à chaque position. Les auteurs la décrivent aussi du point de vue des canaux : chaque couche de convolution $1\\times1$ est un « pooling paramétrique inter-canaux », qui recombine avec des poids les cartes de caractéristiques de la couche précédente avant une ReLU, couche après couche.\n\n\n> [!TIP]\n> \n> Plus tard, GoogLeNet utilise massivement la convolution $1\\times1$ dans ses modules Inception, mais surtout pour réduire le nombre de canaux, afin d'alléger les convolutions $3\\times3$ et $5\\times5$ qui suivent.\n> \n> - **[[14.09] GoogLeNet : Ou encore Inception-V1](/blog/papers/classic-cnns/inception-v1)**\n\n\nPar rapport à maxout, la différence est la suivante : maxout ne peut approcher que des fonctions convexes, alors que le MLP de mlpconv est un approximateur universel de fonctions, capable de traiter des distributions de concepts de formes plus variées. Les auteurs choisissent le MLP plutôt qu'un autre approximateur universel, le réseau à fonctions de base radiales, pour des raisons pratiques : le MLP s'entraîne par rétropropagation avec le reste du réseau convolutif, et il peut lui-même être rendu profond.\n\n### Remplacer les couches entièrement connectées par une moyenne\n\nLa deuxième pièce concerne l'extrémité du réseau.\n\nUn réseau convolutif ordinaire aplatit les cartes de caractéristiques de la dernière couche de convolution, les envoie dans quelques couches entièrement connectées, puis dans un softmax. NiN procède autrement : la dernière couche mlpconv produit un nombre de cartes de caractéristiques **exactement égal au nombre de classes**, chaque carte est moyennée spatialement, et le vecteur obtenu va directement dans le softmax. C'est le pooling moyen global (global average pooling, GAP).\n\nPrenons CIFAR-10 : avec 10 classes, la dernière couche produit 10 cartes de caractéristiques :\n\n```python\nimport torch\n\ntorch.manual_seed(0)\nfeature_maps = torch.randn(1, 10, 8, 8)    # dernière couche : une carte 8×8 pour chacune des 10 classes\n\nlogits = feature_maps.mean(dim=(2, 3))      # pooling moyen global\nprint(logits.shape)\n\nfc_params = 10 * 8 * 8 * 10 + 10            # si l'on branchait plutôt une couche entièrement connectée vers 10 classes\nprint(\"paramètres de la couche entièrement connectée :\", fc_params, \", paramètres du pooling moyen global : 0\")\n```\n\n```text\ntorch.Size([1, 10])\nparamètres de la couche entièrement connectée : 6410 , paramètres du pooling moyen global : 0\n```\n\nLa taille $8\\times8$ n'est ici qu'une illustration. Sur un petit réseau, l'écart semble modeste ; sur AlexNet, il saute aux yeux : ses trois dernières couches entièrement connectées ($9216\\to4096\\to4096\\to1000$) comptent à elles seules $9216\\times4096+4096\\times4096+4096\\times1000 = 58{,}621{,}952$ poids.\n\nLes auteurs avancent trois avantages du GAP :\n\n1. **Aucun paramètre** : cette couche ne peut pas, à elle seule, surapprendre.\n2. **Chaque carte de caractéristiques correspond à une classe** et peut se lire directement comme la carte de confiance de cette classe, ce qui est plus facile à interpréter qu'une couche entièrement connectée.\n3. **L'information spatiale est sommée** : le réseau devient moins sensible aux translations de l'entrée.\n\nLe point 2 suppose une condition : la dernière couche doit réellement apprendre une carte de caractéristiques qui signifie « ceci est un chat ». Selon les auteurs, cela repose sur la modélisation locale plus puissante de mlpconv ; avec une convolution linéaire ordinaire, cette exigence risque d'être trop stricte. Les expériences le montreront.\n\n### Le réseau complet\n\n[![Architecture d'ensemble de NiN : trois couches mlpconv enchaînées, chacune contenant un petit perceptron multicouche ; les cartes de caractéristiques de la dernière couche passent par un pooling moyen global et rejoignent les nœuds de classe en sortie](/content/papers/assets/d94aa487d35fbfcdda30993d49c170efa0980e5c28d2a718b75659cd77164e3e.png)](/content/papers/assets/d94aa487d35fbfcdda30993d49c170efa0980e5c28d2a718b75659cd77164e3e.png)\n\n*Figure 2 de l'article, extraite de la [**page 4 du PDF v3**](https://arxiv.org/pdf/1312.4400v3#page=4). Dans les expériences de l'article, NiN compte toujours trois couches mlpconv et une couche de pooling moyen global.*\n\nLe NiN utilisé dans les expériences empile trois couches mlpconv, chacune contenant un perceptron à trois couches, et se termine par un pooling moyen global. Chaque couche mlpconv est suivie d'un max pooling de pas 2 ; les sorties de toutes les couches mlpconv sauf la dernière reçoivent du dropout, auquel s'ajoute une décroissance des poids. Les auteurs donnent les paramètres détaillés de chaque couche dans le matériel supplémentaire.\n\n## Discussion\n\nLes auteurs évaluent le modèle sur quatre jeux de données : CIFAR-10, CIFAR-100, SVHN et MNIST. Le prétraitement des données et le découpage en ensembles d'entraînement et de validation suivent l'article sur maxout ; l'implémentation s'appuie sur cuda-convnet d'Alex Krizhevsky.\n\n### CIFAR-10 et CIFAR-100\n\nCIFAR-10 contient des images en couleur de $32\\times32$ réparties en 10 classes : 50 000 pour l'entraînement, 10 000 pour le test. Les auteurs donnent à chaque couche mlpconv le même nombre de cartes de caractéristiques que dans le réseau maxout, et n'ajustent que deux hyperparamètres sur l'ensemble de validation : la taille du champ réceptif local et la décroissance des poids.\n\n| Méthode | Taux d'erreur en test |\n| --- | ---: |\n| Conv. maxout + Dropout | 11,68 % |\n| **NIN + Dropout** | **10,41 %** |\n| Conv. maxout + Dropout + augmentation des données | 9,38 % |\n| DropConnect + 12 réseaux + augmentation des données | 9,32 % |\n| **NIN + Dropout + augmentation des données** | **8,81 %** |\n\n*Tableau : extrait de la Table 1 de l'article. L'augmentation des données désigne les translations et les retournements horizontaux.*\n\nSans augmentation des données, NIN fait 1,27 point de pourcentage de moins que maxout ; avec translations et retournements horizontaux, ses 8,81 % passent aussi sous le DropConnect à 12 réseaux.\n\nLe dropout joue un rôle non négligeable. Les auteurs comparent les versions avec et sans dropout entre les couches mlpconv : sans dropout, le taux d'erreur en test est de 14,51 % ; avec, il tombe à 10,41 %, soit selon les auteurs une baisse relative de plus de 20 %.\n\nCIFAR-100 a le même format d'image, mais 100 classes, avec dix fois moins d'images par classe que CIFAR-10. Sans réajuster les hyperparamètres, les auteurs se contentent de faire produire 100 cartes de caractéristiques à la dernière couche : le taux d'erreur en test est de 35,68 %, plus d'un point sous le meilleur résultat de l'époque sans augmentation des données (36,85 %).\n\n### SVHN et MNIST\n\nSVHN porte sur la reconnaissance des chiffres de numéros de rue ; NIN y obtient un taux d'erreur de 2,35 %, sous les 2,47 % de maxout. Dans le même tableau, toutefois, Multi-digit Number Recognition atteint 2,16 % et DropConnect 1,94 %, tous deux meilleurs que NIN.\n\nSur MNIST, NIN obtient 0,47 %, maxout 0,45 %. Les auteurs expliquent que MNIST a déjà été optimisé jusqu'à des taux d'erreur très bas.\n\n### Le pooling moyen global régularise-t-il vraiment ?\n\nPour isoler l'effet du GAP, les auteurs le remplacent par une couche entièrement connectée, sans toucher au reste, et comparent sur CIFAR-10 :\n\n| Couche supérieure | Taux d'erreur en test |\n| --- | ---: |\n| mlpconv + entièrement connectée | 11,59 % |\n| mlpconv + entièrement connectée + Dropout | 10,88 % |\n| mlpconv + pooling moyen global | 10,41 % |\n\n*Tableau : extrait de la Table 5 de l'article.*\n\nLa couche entièrement connectée sans dropout est la moins bonne ; le dropout l'améliore un peu, et le GAP fait mieux que les deux.\n\nLes auteurs se demandent ensuite si un réseau convolutif ordinaire tire le même bénéfice du GAP. Ils l'essaient sur le réseau de l'article de Hinton et al. sur le dropout (trois couches de convolution et une couche localement connectée). Avec une couche entièrement connectée sans dropout, on obtient 17,56 % ; avec dropout, 15,99 % ; avec le GAP, 16,46 % : environ un point de mieux que sans dropout, mais moins bien qu'avec dropout. L'explication des auteurs reprend la condition évoquée plus haut : demander à une convolution linéaire suivie d'une ReLU d'apprendre directement la carte de confiance de chaque classe est peut-être trop exigeant.\n\n### La dernière couche devient-elle vraiment une carte de confiance ?\n\n[![Deux grilles de 10 sur 10. Chaque ligne correspond à une image de test de CIFAR-10 : à gauche l'image d'origine, à droite, dans l'ordre, les cartes de caractéristiques des 10 classes de la dernière couche. Sur la diagonale, encadrée en rouge, la carte de la vraie classe de l'image, le plus souvent la plus lumineuse ; la position des zones lumineuses correspond à peu près à celle de l'objet dans l'image d'origine](/content/papers/assets/c0032c1fba54d5052a18867e6bd6347143d3ba47c5cf4b353a61516107a0cf65.png)](/content/papers/assets/c0032c1fba54d5052a18867e6bd6347143d3ba47c5cf4b353a61516107a0cf65.png)\n\n*Figure 4 de l'article, extraite de la [**page 9 du PDF v3**](https://arxiv.org/pdf/1312.4400v3#page=9). Cartes de caractéristiques de la dernière couche mlpconv, où seules les 10 % d'activations les plus fortes sont affichées ; les classes sont, dans l'ordre, avion, voiture, oiseau, chat, cerf, chien, grenouille, cheval, bateau et camion, et le cadre rouge indique la vraie classe de l'image. Les deux grilles, à gauche et à droite, ne sont que des exemples différents.*\n\nChaque ligne montre une image de test et sa réponse sur les 10 cartes de caractéristiques. Le cadre rouge désigne la carte de la vraie classe, qui est le plus souvent la plus lumineuse de la ligne. Le GAP pousse déjà dans ce sens ; le plus intéressant est ailleurs : sur la carte de la vraie classe, l'endroit le plus lumineux correspond à peu près à la position de l'objet dans l'image d'origine. Les auteurs citent en particulier les objets à la structure nette, comme les voitures.\n\nCes cartes de caractéristiques ont été entraînées avec les seules étiquettes de classe, sans jamais voir la moindre boîte englobante. Dans leur conclusion, les auteurs notent que cela ouvre la voie à la détection d'objets avec NIN.\n\n## Conclusion\n\nLes deux pièces de NiN ont été conçues ensemble : mlpconv dote chaque patch local d'un modèle plus puissant, et c'est ce qui permet au GAP d'exiger que les cartes de caractéristiques de la dernière couche correspondent directement aux classes. Expérimentalement, les résultats sur CIFAR-10 et CIFAR-100, ainsi que la comparaison avec et sans GAP, appuient cette conception ; sur un réseau convolutif ordinaire, le GAP utilisé seul perd une partie de son effet.\n\nNiN a aussi laissé sa trace sur ImageNet : d'après l'article de synthèse de l'ILSVRC, NUS, vainqueur du concours de détection 2014 (catégorie limitée aux données fournies), utilisait le network-in-network dans le cadre de R-CNN.\n\nLes deux pièces de NiN ont ensuite été utilisées séparément : la convolution $1\\times1$ ajuste le nombre de canaux dans les structures en goulot d'étranglement de GoogLeNet et de ResNet, et le pooling moyen global sert à conclure le réseau, le plus souvent suivi d'une couche entièrement connectée, sans plus exiger que chaque carte de caractéristiques corresponde à une classe. La prochaine fois que vous ouvrirez le code d'un réseau de classification, la ligne `AdaptiveAvgPool2d(1)` qui le termine trouve sa source dans cet article.\n\n\n> [!TIP]\n> \n> Le bloc goulot de ResNet utilise des convolutions $1\\times1$ pour réduire puis rétablir le nombre de canaux, et le réseau se termine par un pooling moyen global suivi d'une couche entièrement connectée :\n> \n> - **[[15.12] ResNet : Un réseau convolutif de 100 couches](/blog/papers/classic-cnns/resnet)**\n\n\nQuant à l'idée que « la dernière carte de caractéristiques montre où se trouve l'objet », il faudra attendre [CAM](/blog/papers/classic-cnns/cam) pour qu'elle soit vraiment exploitée ; nous reprendrons le fil dans la note qui lui est consacrée.\n","imageSizes":{"/content/papers/assets/8024fc245eb852a2c0cd34b59c18c680b92766c33d621b934dbf102c1cacda13.png":{"width":896,"height":330},"/content/papers/assets/d94aa487d35fbfcdda30993d49c170efa0980e5c28d2a718b75659cd77164e3e.png":{"width":992,"height":296},"/content/papers/assets/c0032c1fba54d5052a18867e6bd6347143d3ba47c5cf4b353a61516107a0cf65.png":{"width":1078,"height":528}}}
