{"notes":[{"id":"classic-cnns/inceptionnext","category":"classic-cnns","legacyPath":"","legacySlug":"","legacyPaths":[],"title":"InceptionNeXt","subtitle":"Découper en croix","author":"Z. Yuan","paperDate":"2023-03-29","publishedOn":"2025-10-30","world":"external/inceptionnext","paperTitle":"InceptionNeXt: When Inception Meets ConvNeXt","paperUrl":"https://arxiv.org/abs/2303.16900","bibliography":{"title":"InceptionNeXt: When Inception Meets ConvNeXt","authors":["Weihao Yu","Pan Zhou","Shuicheng Yan","Xinchao Wang"],"url":"https://arxiv.org/abs/2303.16900","pdfUrl":"https://arxiv.org/pdf/2303.16900v3","codeUrl":"https://github.com/sail-sg/inceptionnext","preprint":{"id":"2303.16900","submittedOn":"2023-03-29","url":"https://arxiv.org/abs/2303.16900"},"publication":{"venue":"CVPR","year":2024,"kind":"conference","url":"https://openaccess.thecvf.com/content/CVPR2024/html/Yu_InceptionNeXt_When_Inception_Meets_ConvNeXt_CVPR_2024_paper.html"},"citation":"@misc{classiccnnsinceptionnext2023,\n  title = {{InceptionNeXt: When Inception Meets ConvNeXt}},\n  author = {Weihao Yu and Pan Zhou and Shuicheng Yan and Xinchao Wang},\n  year = {2023},\n  eprint = {2303.16900},\n  archivePrefix = {arXiv},\n  url = {https://arxiv.org/abs/2303.16900}\n}\n","citationPath":"/content/papers/citations/classic-cnns/inceptionnext.82116f5daa6e.bib"},"thumbnail":{"src":"/content/papers/assets/1c7bbb1c754725c6cd60caf24d092587cc19bbcf03b619f64821ad4a7fb93429.png","width":1446,"height":786},"locale":"fr","path":"/content/papers/fr/classic-cnns/inceptionnext.324d83b7e91c.md","headings":[{"id":"définir-le-problème","text":"Définir le problème","depth":2},{"id":"metanext","text":"MetaNeXt","depth":3},{"id":"doù-vient-la-lenteur-","text":"D'où vient la lenteur ?","depth":3},{"id":"résoudre-le-problème","text":"Résoudre le problème","depth":2},{"id":"convolution-depthwise-inception","text":"Convolution depthwise Inception","depth":3},{"id":"un-champ-réceptif-en-croix","text":"Un champ réceptif en croix","depth":3},{"id":"assembler-le-réseau","text":"Assembler le réseau","depth":3},{"id":"discussion","text":"Discussion","depth":2},{"id":"imagenet-1k","text":"ImageNet-1K","depth":3},{"id":"lattention-ne-tient-pas-dans-metanext","text":"L'attention ne tient pas dans MetaNeXt","depth":3},{"id":"segmentation-sémantique","text":"Segmentation sémantique","depth":3},{"id":"ablations","text":"Ablations","depth":3},{"id":"conclusion","text":"Conclusion","depth":2}],"anchorAliases":{},"guide":null,"relatedReading":[{"id":"classic-cnns/convnext","relation":"referenced","topic":""},{"id":"vision-transformers/poolformer","relation":"referenced","topic":""},{"id":"classic-cnns/inception-v3","relation":"referenced","topic":""}]},{"id":"classic-cnns/convnext","category":"classic-cnns","legacyPath":"classic-cnns/2201-convnext","legacySlug":"2201-convnext","legacyPaths":[],"title":"ConvNeXt","subtitle":"Redonner sa grandeur à la convolution","author":"Z. Yuan","paperDate":"2022-01-10","publishedOn":"2024-06-30","paperTitle":"A ConvNet for the 2020s","paperUrl":"https://arxiv.org/abs/2201.03545","bibliography":{"title":"A ConvNet for the 2020s","authors":["Zhuang Liu","Hanzi Mao","Chao-Yuan Wu","Christoph Feichtenhofer","Trevor Darrell","Saining Xie"],"url":"https://arxiv.org/abs/2201.03545","pdfUrl":"https://arxiv.org/pdf/2201.03545","codeUrl":"https://github.com/facebookresearch/ConvNeXt","preprint":{"id":"2201.03545","submittedOn":"2022-01-10","url":"https://arxiv.org/abs/2201.03545"},"publication":{"venue":"CVPR","year":2022,"kind":"conference","url":"https://arxiv.org/abs/2201.03545"},"citation":"@misc{classiccnnsconvnext2022,\n  title = {{A ConvNet for the 2020s}},\n  author = {Zhuang Liu and Hanzi Mao and Chao-Yuan Wu and Christoph Feichtenhofer and Trevor Darrell and Saining Xie},\n  year = {2022},\n  eprint = {2201.03545},\n  archivePrefix = {arXiv},\n  url = {https://arxiv.org/abs/2201.03545}\n}\n","citationPath":"/content/papers/citations/classic-cnns/convnext.801b4060b807.bib"},"thumbnail":{"src":"/content/papers/assets/37882616c5c72df33699003256d14bf7c58c8ea5d1e9e4fb5b1c33268c9a6923.jpg","width":1224,"height":432},"locale":"fr","path":"/content/papers/fr/classic-cnns/convnext.9500f216d84f.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":"repenser-larchitecture-du-réseau","text":"Repenser l'architecture du réseau","depth":3},{"id":"introduire-des-méthodes-dentraînement-modernes","text":"Introduire des méthodes d'entraînement modernes","depth":3},{"id":"conception-générale","text":"Conception générale","depth":3},{"id":"à-la-manière-de-resnext","text":"À la manière de ResNeXt","depth":3},{"id":"goulot-inversé","text":"Goulot inversé","depth":3},{"id":"convolutions-à-grand-noyau","text":"Convolutions à grand noyau","depth":3},{"id":"conception-détaillée","text":"Conception détaillée","depth":3},{"id":"discussion","text":"Discussion","depth":2},{"id":"configurations-des-modèles","text":"Configurations des modèles","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":"vision-transformers/convmixer","relation":"comparison","topic":"Mélanger les patches par convolution"},{"id":"vision-transformers/caformer","relation":"comparison","topic":"Mélanger les patches par convolution"},{"id":"reparameterization/replknet","relation":"comparison","topic":"Grands noyaux et architectures convolutives simplifiées"}]},{"id":"vision-transformers/poolformer","category":"vision-transformers","legacyPath":"vision-transformers/2111-poolformer","legacySlug":"2111-poolformer","legacyPaths":[],"title":"PoolFormer","subtitle":"Ce dont vous avez besoin, c'est du cadre !","author":"Z. Yuan","paperDate":"2021-11-22","publishedOn":"2024-07-10","paperTitle":"MetaFormer Is Actually What You Need for Vision","paperUrl":"https://openaccess.thecvf.com/content/CVPR2022/html/Yu_MetaFormer_Is_Actually_What_You_Need_for_Vision_CVPR_2022_paper.html","bibliography":{"title":"MetaFormer Is Actually What You Need for Vision","authors":["Weihao Yu","Mi Luo","Pan Zhou","Chenyang Si","Yichen Zhou","Xinchao Wang","Jiashi Feng","Shuicheng Yan"],"url":"https://openaccess.thecvf.com/content/CVPR2022/html/Yu_MetaFormer_Is_Actually_What_You_Need_for_Vision_CVPR_2022_paper.html","pdfUrl":"https://openaccess.thecvf.com/content/CVPR2022/papers/Yu_MetaFormer_Is_Actually_What_You_Need_for_Vision_CVPR_2022_paper.pdf","codeUrl":"https://github.com/sail-sg/poolformer","preprint":{"id":"2111.11418","submittedOn":"2021-11-22","url":"https://arxiv.org/abs/2111.11418"},"publication":{"venue":"CVPR","year":2022,"kind":"conference","url":"https://openaccess.thecvf.com/content/CVPR2022/html/Yu_MetaFormer_Is_Actually_What_You_Need_for_Vision_CVPR_2022_paper.html"},"citation":"@misc{visiontransformerspoolformer2021,\n  title = {{MetaFormer Is Actually What You Need for Vision}},\n  author = {Weihao Yu and Mi Luo and Pan Zhou and Chenyang Si and Yichen Zhou and Xinchao Wang and Jiashi Feng and Shuicheng Yan},\n  year = {2021},\n  eprint = {2111.11418},\n  archivePrefix = {arXiv},\n  url = {https://arxiv.org/abs/2111.11418}\n}\n","citationPath":"/content/papers/citations/vision-transformers/poolformer.f2f96629d283.bib"},"thumbnail":{"src":"/content/papers/assets/3cb141e9bb1247410c8214276b21b28ed1d536060d470406f1bfb0c88fe68df2.jpg","width":1498,"height":548},"locale":"fr","path":"/content/papers/fr/vision-transformers/poolformer.aec02301c056.md","headings":[{"id":"définir-le-problème","text":"Définir le problème","depth":2},{"id":"input-embedding","text":"Input Embedding","depth":3},{"id":"token-mixer","text":"Token-Mixer","depth":3},{"id":"channel-mlp","text":"Channel MLP","depth":3},{"id":"et-si-le-token-mixer-nétait-pas-le-plus-important-","text":"Et si le token mixer n'était pas le plus important ?","depth":3},{"id":"résoudre-le-problème","text":"Résoudre le problème","depth":2},{"id":"architecture-du-modèle","text":"Architecture du modèle","depth":3},{"id":"configurations-du-modèle","text":"Configurations du modèle","depth":3},{"id":"discussion","text":"Discussion","depth":2},{"id":"expériences-sur-imagenet","text":"Expériences sur ImageNet","depth":3},{"id":"expériences-dablation","text":"Expériences d'ablation","depth":3},{"id":"conclusion","text":"Conclusion","depth":2}],"anchorAliases":{},"guide":null,"relatedReading":[{"id":"vision-transformers/mlp-mixer","relation":"background","topic":"Séparer l’architecture du mélange des tokens"},{"id":"vision-transformers/caformer","relation":"next","topic":"Séparer l’architecture du mélange des tokens"}]},{"id":"classic-cnns/inception-v3","category":"classic-cnns","legacyPath":"","legacySlug":"","legacyPaths":[],"title":"Inception-v3","subtitle":"Les grands noyaux tirent leur révérence","author":"Z. Yuan","paperDate":"2015-12-02","publishedOn":"2023-11-15","world":"external/inception-v3","paperTitle":"Rethinking the Inception Architecture for Computer Vision","paperUrl":"https://arxiv.org/abs/1512.00567","bibliography":{"title":"Rethinking the Inception Architecture for Computer Vision","authors":["Christian Szegedy","Vincent Vanhoucke","Sergey Ioffe","Jonathon Shlens","Zbigniew Wojna"],"url":"https://arxiv.org/abs/1512.00567","pdfUrl":"https://arxiv.org/pdf/1512.00567v3","codeUrl":null,"preprint":{"id":"1512.00567","submittedOn":"2015-12-02","url":"https://arxiv.org/abs/1512.00567"},"publication":{"venue":"CVPR","year":2016,"kind":"conference","url":"https://openaccess.thecvf.com/content_cvpr_2016/html/Szegedy_Rethinking_the_Inception_CVPR_2016_paper.html"},"citation":"@misc{classiccnnsinceptionv32015,\n  title = {{Rethinking the Inception Architecture for Computer Vision}},\n  author = {Christian Szegedy and Vincent Vanhoucke and Sergey Ioffe and Jonathon Shlens and Zbigniew Wojna},\n  year = {2015},\n  eprint = {1512.00567},\n  archivePrefix = {arXiv},\n  url = {https://arxiv.org/abs/1512.00567}\n}\n","citationPath":"/content/papers/citations/classic-cnns/inception-v3.5636c0bddf2d.bib"},"thumbnail":{"src":"/content/papers/assets/c87d3d6fa9ea76d954eba2570f702150eca32d62c7cdb3d724075a4be9a63080.png","width":419,"height":358},"locale":"fr","path":"/content/papers/fr/classic-cnns/inception-v3.448d0dcc2c16.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":"remplacer-un-55-par-deux-couches-33","text":"Remplacer un 5×5 par deux couches 3×3","depth":3},{"id":"décomposer-encore-en-1n-et-n1","text":"Décomposer encore en 1×n et n×1","depth":3},{"id":"le-véritable-rôle-des-classifieurs-auxiliaires","text":"Le véritable rôle des classifieurs auxiliaires","depth":3},{"id":"réduire-les-cartes-de-caractéristiques-sans-étrangler-linformation","text":"Réduire les cartes de caractéristiques sans étrangler l'information","depth":3},{"id":"assembler-les-pièces","text":"Assembler les pièces","depth":3},{"id":"rendre-le-modèle-moins-sûr-de-lui","text":"Rendre le modèle moins sûr de lui","depth":3},{"id":"réglages-dentraînement","text":"Réglages d'entraînement","depth":3},{"id":"discussion","text":"Discussion","depth":2},{"id":"ajouter-les-modifications-une-à-une","text":"Ajouter les modifications une à une","depth":3},{"id":"avec-une-résolution-plus-faible-combien-perd-on","text":"Avec une résolution plus faible, combien perd-on ?","depth":3},{"id":"comparaison-avec-dautres-modèles","text":"Comparaison avec d'autres modèles","depth":3},{"id":"conclusion","text":"Conclusion","depth":2}],"anchorAliases":{},"guide":null,"relatedReading":[{"id":"classic-cnns/inception-v1","relation":"referenced","topic":""},{"id":"normalization/batchnorm","relation":"referenced","topic":""},{"id":"classic-cnns/convnext","relation":"referenced","topic":""}]}],"text":"ConvNeXt-T demande 4.5 GMACs et ResNet-50, 4.1 GMACs : des coûts voisins. Pourtant, à l'entraînement sur un A100, ResNet-50 traite 969 images par seconde, contre seulement 575 pour ConvNeXt-T, soit environ 60%.\n\nPourquoi un tel écart à coût de calcul comparable ? La convolution depthwise 7×7 est en cause. Chaque canal est traité séparément : peu de multiplications-additions, mais beaucoup de données à déplacer. Le GPU passe une bonne partie de son temps à attendre la mémoire. En agrandissant le noyau de 3×3 à 7×7, ConvNeXt gagne en précision, avec ce problème de vitesse en contrepartie.\n\nCe travail vient de l'Université nationale de Singapour, de la Singapore Management University, de Sea AI Lab et de Skywork AI. Son premier auteur, Weihao Yu, est aussi celui de MetaFormer, qui ramenait le Transformer à un cadre « mélangeur de tokens plus MLP ». Il applique ici la même décomposition à ConvNeXt.\n\n\n> [!TIP]\n> \n> Pour ConvNeXt et MetaFormer, on peut commencer par ces deux notes :\n> \n> - **[[22.01] ConvNeXt : Redonner sa grandeur à la convolution](/blog/papers/classic-cnns/convnext)**\n> - **[[21.11] PoolFormer : Ce dont vous avez besoin, c'est du cadre !](/blog/papers/vision-transformers/poolformer)**\n\n\n[![Figure 1 de l'article : l'axe horizontal donne le débit d'entraînement sur A100 en images/s, et l'axe vertical la précision top-1 sur ImageNet. ConvNeXt-T/k7 se trouve en haut à gauche, vers 82.1% et 575 images/s ; les noyaux 5×5 puis 3×3 le déplacent vers la droite en réduisant progressivement la précision. ResNet-50 est en bas à droite, vers 970 images/s et un peu plus de 78%. InceptionNeXt-T est en haut à droite ; une flèche rouge indique une vitesse 1.6 fois supérieure à ConvNeXt-T/k7.](/content/papers/assets/1f6716ae5b81879c492b1f16031d8c3a3e65f652d97318b88209b2b60ec9d7c4.png)](/content/papers/assets/1f6716ae5b81879c492b1f16031d8c3a3e65f652d97318b88209b2b60ec9d7c4.png)\n\n*Figure 1 de Yu et al., extraite de la [**page 1 du PDF**](https://arxiv.org/pdf/2303.16900v3#page=1). La légende originale est omise.*\n\nLe coin supérieur droit est l'objectif : conserver la précision de ConvNeXt-T avec une vitesse proche de ResNet-50.\n\n## Définir le problème\n\n### MetaNeXt\n\nLes auteurs commencent par abstraire le bloc de ConvNeXt.\n\n[![Figure 2 de l'article : quatre blocs sont alignés de gauche à droite. MetaFormer possède deux connexions résiduelles, l'une autour de Norm et du Token Mixer en pointillés, l'autre autour de Norm et du MLP. MetaNeXt possède une seule connexion résiduelle, avec Token Mixer, Norm et MLP sur le même chemin. ConvNeXt remplace le Token Mixer par une DWConv 7×7. Dans le Token Mixer en pointillés d'InceptionNeXt, l'entrée est divisée en quatre branches : DWConv 3×3, 1×11, 11×1 et Identity, puis les résultats sont concaténés.](/content/papers/assets/1c7bbb1c754725c6cd60caf24d092587cc19bbcf03b619f64821ad4a7fb93429.png)](/content/papers/assets/1c7bbb1c754725c6cd60caf24d092587cc19bbcf03b619f64821ad4a7fb93429.png)\n\n*Figure 2 de Yu et al., extraite de la [**page 2 du PDF**](https://arxiv.org/pdf/2303.16900v3#page=2). La légende originale est omise.*\n\nÀ gauche, MetaFormer a deux connexions résiduelles : une pour le mélangeur de tokens, une pour le MLP. C'est la structure du Transformer. ConvNeXt n'en a qu'une : mélange spatial, normalisation et MLP se suivent sur le même chemin. Les auteurs appellent MetaNeXt ce cadre à connexion résiduelle unique. ConvNeXt et InceptionNeXt en sont deux réalisations, qui diffèrent uniquement par leur mélangeur de tokens.\n\n### D'où vient la lenteur ?\n\nLes auteurs réalisent d'abord quelques expériences sur ConvNeXt-T, en changeant uniquement la convolution depthwise :\n\n| Noyau depthwise | Proportion de canaux convolués | Entraînement (images/s) | Inférence (images/s) | top-1 |\n| --- | ---: | ---: | ---: | ---: |\n| 7×7 | 1 | 575 | 2413 | 82.1% |\n| 5×5 | 1 | 675 | 2704 | 82.0% |\n| 3×3 | 1 | 798 | 2802 | 81.5% |\n| 3×3 | 1/4 | 871 | 2808 | 81.3% |\n| 3×3 | 1/8 | 901 | 2833 | 80.8% |\n| 3×3 | 1/16 | 916 | 2846 | 80.1% |\n\n*Tableau : certaines lignes du tableau 1 de l'article. A100, batch de 128, TF32.*\n\nPasser de 7×7 à 3×3 accélère l'entraînement de 39%, au prix de 0.6 point de précision. Puis, suivant ShuffleNet V2, les auteurs ne convoluent qu'une partie des canaux et laissent les autres intacts. À 1/4 des canaux, l'entraînement accélère encore, pour seulement 0.2 point perdu de plus.\n\nDeux observations se dégagent. La convolution depthwise à grand noyau est le goulot d'étranglement ; une couche depthwise peut se contenter de traiter une partie des canaux. Mais réduire le noyau réduit aussi le champ réceptif. Comment récupérer les 0.6 point perdus ?\n\n## Résoudre le problème\n\n### Convolution depthwise Inception\n\nLes auteurs divisent les canaux en quatre groupes :\n\n- Un groupe passe par une convolution depthwise 3×3.\n- Un autre passe par un noyau horizontal 1×11.\n- Un autre passe par un noyau vertical 11×1.\n- Le reste passe sans modification.\n\nChaque branche convolutive reçoit $C/8$ canaux, les $5C/8$ restants passent directement, puis les quatre groupes sont concaténés. Décomposer $k\\times k$ en $1\\times k$ et $k\\times 1$ est une vieille idée d'Inception-v3, d'où le nom.\n\n\n> [!TIP]\n> \n> Inception-v3 utilisait déjà cette méthode pour décomposer les grands noyaux :\n> \n> - **[[15.12] Inception-v3 : Les grands noyaux tirent leur révérence](/blog/papers/classic-cnns/inception-v3)**\n\n\nLe nombre de paramètres passe de $k^2C$ pour une convolution depthwise à $(2k+9)C/8$ : $2k$ vient des deux bandes et 9 du noyau 3×3. La dépendance à la taille du noyau devient linéaire au lieu de quadratique. Reprenons le code PyTorch fourni dans l'article et comptons les paramètres :\n\n```python\nimport torch\nimport torch.nn as nn\n\nclass InceptionDWConv2d(nn.Module):\n    def __init__(self, c, square=3, band=11, ratio=1/8):\n        super().__init__()\n        g = int(c * ratio)                                    # Canaux de chaque branche convolutive\n        self.hw = nn.Conv2d(g, g, square, padding=square // 2, groups=g)\n        self.w = nn.Conv2d(g, g, (1, band), padding=(0, band // 2), groups=g)\n        self.h = nn.Conv2d(g, g, (band, 1), padding=(band // 2, 0), groups=g)\n        self.split = (g, g, g, c - 3 * g)                     # 3×3, 1×11, 11×1, identité\n\n    def forward(self, x):\n        x_hw, x_w, x_h, x_id = torch.split(x, self.split, dim=1)\n        return torch.cat((self.hw(x_hw), self.w(x_w), self.h(x_h), x_id), dim=1)\n\nc = 96                                                        # Canaux du premier étage d'InceptionNeXt-T\nparams = lambda m: sum(p.numel() for p in m.parameters())\nprint(\"Depthwise 7×7 :\", params(nn.Conv2d(c, c, 7, padding=3, groups=c)))\nprint(\"Depthwise 3×3 :\", params(nn.Conv2d(c, c, 3, padding=1, groups=c)))\nprint(\"Depthwise Inception :\", params(InceptionDWConv2d(c)))\n```\n\n```text\nDepthwise 7×7 : 4800\nDepthwise 3×3 : 960\nDepthwise Inception : 408\n```\n\nLa convolution depthwise Inception a même moins de paramètres qu'une depthwise 3×3, puisque cinq huitièmes des canaux ne subissent aucune convolution.\n\n### Un champ réceptif en croix\n\nÀ ce stade, on peut avoir l'impression d'y perdre. Avec un noyau 7×7, chaque canal voit un carré complet de 7×7. Ici, il ne voit qu'un carré 3×3, une ligne horizontale ou une ligne verticale.\n\n[Une question sur GitHub](https://github.com/sail-sg/inceptionnext/issues/3) demandait si cette « décomposition » était mathématiquement équivalente au 7×7. Les auteurs répondent que non : decompose signifie ici plutôt « remplacer ». Quelle étendue couvre alors ce remplacement ?\n\nLe MLP joue le rôle clé. La convolution 1×1 qui suit la depthwise mélange les canaux. Une caractéristique passée par la bande horizontale d'un bloc peut donc rejoindre la branche verticale au bloc suivant. Simplifions les blocs en « convolution spatiale puis convolution 1×1 », et remontons les gradients pour voir les positions d'entrée qui influencent la sortie centrale :\n\n```python\ndef seen(blocks, make_mixer, size=33):\n    torch.manual_seed(0)\n    layers = []\n    for _ in range(blocks):                                   # Convolution spatiale puis mélange des canaux par 1×1\n        layers += [make_mixer(), nn.Conv2d(c, c, 1)]\n    net = nn.Sequential(*layers)\n    x = torch.randn(1, c, size, size, requires_grad=True)\n    net(x)[0, :, size // 2, size // 2].sum().backward()       # Positions d'entrée visibles depuis la sortie centrale\n    grid = x.grad[0].abs().sum(0) > 0\n    rows, cols = grid.nonzero().T\n    return f\"{int(grid.sum())} positions visibles, étendue {int(rows.max() - rows.min() + 1)}×{int(cols.max() - cols.min() + 1)}\"\n\nfor blocks in (1, 2):\n    print(f\"Empilement de {blocks} bloc(s)\")\n    print(\"  Depthwise 7×7 :\", seen(blocks, lambda: nn.Conv2d(c, c, 7, padding=3, groups=c)))\n    print(\"  Depthwise Inception :\", seen(blocks, lambda: InceptionDWConv2d(c)))\n```\n\n```text\nEmpilement de 1 bloc(s)\n  Depthwise 7×7 : 49 positions visibles, étendue 7×7\n  Depthwise Inception : 25 positions visibles, étendue 11×11\nEmpilement de 2 bloc(s)\n  Depthwise 7×7 : 169 positions visibles, étendue 13×13\n  Depthwise Inception : 149 positions visibles, étendue 21×21\n```\n\nAvec un seul bloc, la depthwise Inception voit une croix : un centre de 3×3 et deux lignes de longueur 11, soit 25 positions. Au deuxième bloc, les bandes horizontales et verticales complètent un carré 11×11, prolongé de quatre bras, soit 149 positions. Deux couches 7×7 couvrent 13×13, donc 169 positions : un nombre voisin, mais une étendue plus petite.\n\n### Assembler le réseau\n\nLe nombre de blocs et de canaux par étage reprend ConvNeXt, tout comme la structure à quatre étages. Deux détails changent. La normalisation utilise BatchNorm, qui peut fusionner avec la convolution à l'inférence pour gagner en vitesse. Au dernier étage, le facteur d'expansion du MLP passe de 4 à 3, et les paramètres économisés sont réaffectés à la tête de classification. Le plus petit modèle, Atto, porte la proportion de chaque branche à 1/4 et utilise des bandes de longueur 9.\n\n## Discussion\n\n### ImageNet-1K\n\nLa recette d'entraînement reprend DeiT et ConvNeXt, avec 300 epochs. Le débit est mesuré en TF32 sur A100 :\n\n| Modèle | Paramètres | MACs | Entraînement (images/s) | Inférence (images/s) | top-1 |\n| --- | ---: | ---: | ---: | ---: | ---: |\n| RSB-ResNet-50 | 26M | 4.1G | 969 | 3149 | 79.8% |\n| ConvNeXt-T | 29M | 4.5G | 575 | 2413 | 82.1% |\n| InceptionNeXt-T | 28M | 4.2G | **901** | **2900** | **82.3%** |\n| ConvNeXt-S | 50M | 8.7G | 361 | 1535 | 83.1% |\n| InceptionNeXt-S | 49M | 8.4G | **521** | **1750** | **83.5%** |\n| ConvNeXt-B | 89M | 15.4G | 267 | 1122 | 83.8% |\n| InceptionNeXt-B | 87M | 14.9G | **375** | **1244** | **84.0%** |\n\n*Tableau : certaines lignes du tableau 4 de l'article. RSB-ResNet-50 est un ResNet-50 réentraîné avec la nouvelle recette « ResNet strikes back ».*\n\nInceptionNeXt-T gagne 0.2 point sur ConvNeXt-T, avec un entraînement 57% plus rapide et une inférence 20% plus rapide. Il atteint 93% de la vitesse d'entraînement de ResNet-50 et 92% de sa vitesse d'inférence. Parler de « la vitesse de ResNet-50 » est un peu optimiste, mais l'écart est déjà faible.\n\nL'accélération diminue avec la taille du modèle : 57% à l'entraînement pour T, 44% pour S et 40% pour B. Le coût de la depthwise croît avec le nombre de canaux, celui du MLP avec son carré. Plus le réseau est large, plus le MLP prend de temps, et moins le seul remplacement du mélangeur peut en économiser.\n\nÀ l'autre extrême, le modèle Atto accélère l'entraînement de 219%, mais perd 0.4 point face à ConvNeXt-A.\n\nLes chiffres dépendent aussi du matériel. Dans le même tableau, en FP32 sur 2080Ti, l'inférence de T accélère de 39%, contre 20% sur A100. L'article de RDNet mesure ensuite lui-même la latence d'inférence : par batch de 128, InceptionNeXt-T demande 132 ms et ConvNeXt-T 150 ms, soit environ 14% de vitesse supplémentaire.\n\n### L'attention ne tient pas dans MetaNeXt\n\nPuisque MetaNeXt simplifie MetaFormer, les auteurs essaient aussi d'insérer de l'auto-attention dans ce bloc à une seule connexion résiduelle, sous le nom MetaNeXt-Attn. L'entraînement échoue : seulement 3.9% sur ImageNet, contre 79.8% pour DeiT-S de taille comparable.\n\nFusionner les deux connexions résiduelles accélère le calcul, mais le mélangeur de tokens doit rester simple. Ce cadre accepte la convolution ; l'attention n'y fonctionne pas.\n\n### Segmentation sémantique\n\nSur ADE20K avec UperNet, pour 160K itérations d'entraînement :\n\n| Taille | Swin | ConvNeXt | InceptionNeXt |\n| --- | ---: | ---: | ---: |\n| T | 45.8 | 46.7 | **47.9** |\n| S | 49.5 | 49.6 | **50.0** |\n| B | 49.7 | 49.9 | **50.6** |\n\n*Tableau : tableau 6 de l'article, valeurs de mIoU.*\n\nPour T, le gain de 1.2 dépasse nettement les 0.2 point en classification. Il faut toutefois regarder le protocole. [Un utilisateur sur GitHub](https://github.com/sail-sg/inceptionnext/issues/10) obtient des résultats voisins de ConvNeXt en intégrant InceptionNeXt à son propre modèle de segmentation. Les auteurs répondent que leur tableau, suivant ConvNeXt, donne la mIoU en évaluation multi-échelle ; en mono-échelle, les deux modèles sont proches. Le code d'entraînement pour la segmentation n'a pas été publié, et plusieurs utilisateurs le demandent dans l'issue.\n\n### Ablations\n\nÀ partir d'InceptionNeXt-T, les auteurs modifient un seul élément à la fois :\n\n| Modification | Entraînement (images/s) | Inférence (images/s) | top-1 |\n| --- | ---: | ---: | ---: |\n| Référence | 901 | 2900 | 82.3% |\n| Sans bande horizontale | 947 | 3093 | 81.9% |\n| Sans bande verticale | 954 | 3173 | 81.9% |\n| Sans carré 3×3 | 940 | 3004 | 82.0% |\n| Deux bandes en série | 903 | 2971 | 82.1% |\n| Longueur des bandes de 11 à 13 | 896 | 2895 | 82.0% |\n| Proportion des branches de 1/8 à 1/4 | 834 | 2499 | 82.2% |\n| Proportion des branches de 1/8 à 1/16 | 936 | 3097 | 81.8% |\n| LayerNorm à la place de BatchNorm | 721 | 2646 | 82.4% |\n\n*Tableau : certaines lignes du tableau 8 de l'article.*\n\nLes deux bandes sont essentielles : en retirer une coûte 0.4 point. Ce sont elles qui soutiennent le champ réceptif. Supprimer le carré 3×3 ne coûte que 0.3 point ; les auteurs proposent cette version si la vitesse prime. Porter la proportion à 1/4 ne sert qu'à ralentir le modèle ; la réduire à 1/16 fait perdre 0.5 point.\n\nLayerNorm gagne 0.1 point, mais réduit la vitesse d'entraînement de 20%. Les auteurs retiennent BatchNorm.\n\n## Conclusion\n\nInceptionNeXt remplace la depthwise 7×7 par un petit carré, deux bandes et une grande majorité de canaux laissés intacts. La précision de ConvNeXt-T est préservée et la vitesse d'entraînement revient près de celle de ResNet-50.\n\nIl n'utilise que les convolutions depthwise intégrées à PyTorch, sans opérateur personnalisé ; timm fournit notamment les poids préentraînés `inception_next_tiny`. Pour accélérer un modèle de la famille ConvNeXt, on peut essayer ce remplacement du mélangeur de tokens.\n\nQuant aux 1.2 point du tableau de segmentation, demandons d'abord s'il s'agit d'une évaluation mono-échelle ou multi-échelle, avant de changer de backbone.\n","imageSizes":{"/content/papers/assets/1f6716ae5b81879c492b1f16031d8c3a3e65f652d97318b88209b2b60ec9d7c4.png":{"width":924,"height":666},"/content/papers/assets/1c7bbb1c754725c6cd60caf24d092587cc19bbcf03b619f64821ad4a7fb93429.png":{"width":1446,"height":786}}}
