{"notes":[{"id":"classic-cnns/rdnet","category":"classic-cnns","legacyPath":"","legacySlug":"","legacyPaths":[],"title":"RDNet","subtitle":"足さずにつなぐ","author":"Z. Yuan","paperDate":"2024-03-28","publishedOn":"2026-01-14","world":"external/rdnet","paperTitle":"DenseNets Reloaded: Paradigm Shift Beyond ResNets and ViTs","paperUrl":"https://arxiv.org/abs/2403.19588","bibliography":{"title":"DenseNets Reloaded: Paradigm Shift Beyond ResNets and ViTs","authors":["Donghyun Kim","Byeongho Heo","Dongyoon Han"],"url":"https://arxiv.org/abs/2403.19588","pdfUrl":"https://arxiv.org/pdf/2403.19588v2","codeUrl":"https://github.com/naver-ai/rdnet","preprint":{"id":"2403.19588","submittedOn":"2024-03-28","url":"https://arxiv.org/abs/2403.19588"},"publication":{"venue":"ECCV","year":2024,"kind":"conference","url":"https://doi.org/10.1007/978-3-031-72646-0_23"},"citation":"@misc{classiccnnsrdnet2024,\n  title = {{DenseNets Reloaded: Paradigm Shift Beyond ResNets and ViTs}},\n  author = {Donghyun Kim and Byeongho Heo and Dongyoon Han},\n  year = {2024},\n  eprint = {2403.19588},\n  archivePrefix = {arXiv},\n  url = {https://arxiv.org/abs/2403.19588}\n}\n","citationPath":"/content/papers/citations/classic-cnns/rdnet.0ac4484543c0.bib"},"thumbnail":{"src":"/content/papers/assets/47b1a145d10885d762e8f5476e49d96dc1e35fdc1e3227a66162ec1bf6870710.png","width":1230,"height":615},"locale":"ja","path":"/content/papers/ja/classic-cnns/rdnet.1ac22fc658a4.md","headings":[{"id":"問題の定義","text":"問題の定義","depth":2},{"id":"加算と連結の違い","text":"加算と連結の違い","depth":3},{"id":"まず1万5千のランダムなネットワークを試す","text":"まず1万5千のランダムなネットワークを試す","depth":3},{"id":"問題の解決","text":"問題の解決","depth":2},{"id":"densenet-201から1つずつ変える","text":"DenseNet-201から1つずつ変える","depth":3},{"id":"チャネル数を追う","text":"チャネル数を追う","depth":3},{"id":"考察","text":"考察","depth":2},{"id":"imagenet","text":"ImageNet","depth":3},{"id":"下流タスク","text":"下流タスク","depth":3},{"id":"stochastic-depthも役立つ","text":"stochastic depthも役立つ","depth":3},{"id":"結論","text":"結論","depth":2}],"anchorAliases":{},"guide":null,"relatedReading":[{"id":"classic-cnns/densenet","relation":"referenced","topic":""},{"id":"classic-cnns/cspnet","relation":"referenced","topic":""},{"id":"classic-cnns/regnet","relation":"referenced","topic":""}]},{"id":"classic-cnns/densenet","category":"classic-cnns","legacyPath":"classic-cnns/1608-densenet","legacySlug":"1608-densenet","legacyPaths":[],"title":"DenseNet","subtitle":"すべて繋げる","author":"Z. Yuan","paperDate":"2016-08-25","publishedOn":"2024-07-02","paperTitle":"Densely Connected Convolutional Networks","paperUrl":"https://arxiv.org/abs/1608.06993","bibliography":{"title":"Densely Connected Convolutional Networks","authors":["Gao Huang","Zhuang Liu","Laurens van der Maaten","Kilian Q. Weinberger"],"url":"https://arxiv.org/abs/1608.06993","pdfUrl":"https://arxiv.org/pdf/1608.06993","codeUrl":null,"preprint":{"id":"1608.06993","submittedOn":"2016-08-25","url":"https://arxiv.org/abs/1608.06993"},"publication":{"venue":"CVPR","year":2017,"kind":"conference","url":"https://arxiv.org/abs/1608.06993"},"citation":"@misc{classiccnnsdensenet2016,\n  title = {{Densely Connected Convolutional Networks}},\n  author = {Gao Huang and Zhuang Liu and Laurens van der Maaten and Kilian Q. Weinberger},\n  year = {2016},\n  eprint = {1608.06993},\n  archivePrefix = {arXiv},\n  url = {https://arxiv.org/abs/1608.06993}\n}\n","citationPath":"/content/papers/citations/classic-cnns/densenet.6f28153b67f7.bib"},"thumbnail":{"src":"/content/papers/assets/4f073a0fd1fc5b7415ca19c48934d180f9043fddc08301819a50ceb1b0ebfc69.jpg","width":1184,"height":828},"locale":"ja","path":"/content/papers/ja/classic-cnns/densenet.dfcad0329b64.md","headings":[{"id":"問題の定義","text":"問題の定義","depth":2},{"id":"問題の解決","text":"問題の解決","depth":2},{"id":"ネットワークアーキテクチャ","text":"ネットワークアーキテクチャ","depth":3},{"id":"トランジション層と平均プーリング","text":"トランジション層と平均プーリング","depth":3},{"id":"成長率","text":"成長率","depth":3},{"id":"ボトルネック層","text":"ボトルネック層","depth":3},{"id":"圧縮","text":"圧縮","depth":3},{"id":"実装の詳細","text":"実装の詳細","depth":3},{"id":"討論","text":"討論","depth":2},{"id":"実験結果","text":"実験結果","depth":3},{"id":"コンパクトなモデル","text":"コンパクトなモデル","depth":3},{"id":"特徴再利用","text":"特徴再利用","depth":3},{"id":"結論","text":"結論","depth":2}],"anchorAliases":{},"guide":null,"relatedReading":[{"id":"classic-cnns/resnet","relation":"background","topic":"深い畳み込みネットワークの学習"}]},{"id":"classic-cnns/cspnet","category":"classic-cnns","legacyPath":"classic-cnns/1911-cspnet","legacySlug":"1911-cspnet","legacyPaths":[],"title":"CSPNet","subtitle":"半半半プラグイン","author":"Z. Yuan","paperDate":"2019-11-27","publishedOn":"2024-09-29","paperTitle":"CSPNet: A New Backbone that can Enhance Learning Capability of CNN","paperUrl":"https://arxiv.org/abs/1911.11929","bibliography":{"title":"CSPNet: A New Backbone that can Enhance Learning Capability of CNN","authors":["Chien-Yao Wang","Hong-Yuan Mark Liao","I-Hau Yeh","Yueh-Hua Wu","Ping-Yang Chen","Jun-Wei Hsieh"],"url":"https://arxiv.org/abs/1911.11929","pdfUrl":"https://arxiv.org/pdf/1911.11929","codeUrl":null,"preprint":{"id":"1911.11929","submittedOn":"2019-11-27","url":"https://arxiv.org/abs/1911.11929"},"publication":{"venue":"CVPR Workshops","year":2020,"kind":"workshop","url":"https://doi.org/10.1109/cvprw50498.2020.00203"},"citation":"@misc{classiccnnscspnet2019,\n  title = {{CSPNet: A New Backbone that can Enhance Learning Capability of CNN}},\n  author = {Chien-Yao Wang and Hong-Yuan Mark Liao and I-Hau Yeh and Yueh-Hua Wu and Ping-Yang Chen and Jun-Wei Hsieh},\n  year = {2019},\n  eprint = {1911.11929},\n  archivePrefix = {arXiv},\n  url = {https://arxiv.org/abs/1911.11929}\n}\n","citationPath":"/content/papers/citations/classic-cnns/cspnet.2914b9492a0c.bib"},"thumbnail":{"src":"/content/papers/assets/2602af8b5f92cba820e545c84abd94943cab1fe2631cf83834972b54b374ed20.jpg","width":2809,"height":1911},"locale":"ja","path":"/content/papers/ja/classic-cnns/cspnet.e7262919464c.md","headings":[{"id":"問題の定義","text":"問題の定義","depth":2},{"id":"問題の解決","text":"問題の解決","depth":2},{"id":"モデルアーキテクチャ","text":"モデルアーキテクチャ","depth":3},{"id":"トランジションレイヤー","text":"トランジションレイヤー","depth":3},{"id":"正確な融合モデル","text":"正確な融合モデル","depth":3},{"id":"討論","text":"討論","depth":2},{"id":"csp-構造の有効性","text":"CSP 構造の有効性","depth":3},{"id":"efm-構造の有効性","text":"EFM 構造の有効性","depth":3},{"id":"imagenet-での性能","text":"ImageNet での性能","depth":3},{"id":"ms-coco-での性能","text":"MS COCO での性能","depth":3},{"id":"推論速度","text":"推論速度","depth":3},{"id":"結論","text":"結論","depth":2}],"anchorAliases":{},"guide":null,"relatedReading":[{"id":"classic-cnns/inception-v1","relation":"comparison","topic":"分岐・グループ畳み込み・特徴の再利用"},{"id":"classic-cnns/resnext","relation":"comparison","topic":"分岐・グループ畳み込み・特徴の再利用"}]},{"id":"classic-cnns/regnet","category":"classic-cnns","legacyPath":"","legacySlug":"","legacyPaths":[],"title":"RegNet","subtitle":"良いアーキテクチャはどれも似ている？","author":"Z. Yuan","paperDate":"2020-03-30","publishedOn":"2024-12-16","world":"external/regnet","paperTitle":"Designing Network Design Spaces","paperUrl":"https://arxiv.org/abs/2003.13678","bibliography":{"title":"Designing Network Design Spaces","authors":["Ilija Radosavovic","Raj Prateek Kosaraju","Ross Girshick","Kaiming He","Piotr Dollár"],"url":"https://arxiv.org/abs/2003.13678","pdfUrl":"https://arxiv.org/pdf/2003.13678v1","codeUrl":null,"preprint":{"id":"2003.13678","submittedOn":"2020-03-30","url":"https://arxiv.org/abs/2003.13678"},"publication":{"venue":"CVPR","year":2020,"kind":"conference","url":"https://openaccess.thecvf.com/content_CVPR_2020/html/Radosavovic_Designing_Network_Design_Spaces_CVPR_2020_paper.html"},"citation":"@misc{classiccnnsregnet2020,\n  title = {{Designing Network Design Spaces}},\n  author = {Ilija Radosavovic and Raj Prateek Kosaraju and Ross Girshick and Kaiming He and Piotr Dollár},\n  year = {2020},\n  eprint = {2003.13678},\n  archivePrefix = {arXiv},\n  url = {https://arxiv.org/abs/2003.13678}\n}\n","citationPath":"/content/papers/citations/classic-cnns/regnet.51d4a967c43d.bib"},"thumbnail":{"src":"/content/papers/assets/477f84998189b88eda3ae1c093bfad949ef34cf53e00368019c348b971c3a63d.png","width":1013,"height":550},"locale":"ja","path":"/content/papers/ja/classic-cnns/regnet.3066477ac88b.md","headings":[{"id":"問題の定義","text":"問題の定義","depth":2},{"id":"手作業の設計にもnasにも欠けているもの","text":"手作業の設計にもNASにも欠けているもの","depth":3},{"id":"二つの設計空間をどう比べるか","text":"二つの設計空間をどう比べるか","depth":3},{"id":"問題の解決","text":"問題の解決","depth":2},{"id":"出発点anynet","text":"出発点：AnyNet","depth":3},{"id":"一歩ずつ絞り込む","text":"一歩ずつ絞り込む","depth":3},{"id":"幅は一本の斜めの直線","text":"幅は一本の斜めの直線","depth":3},{"id":"regnet","text":"RegNet","depth":3},{"id":"考察","text":"考察","depth":2},{"id":"よくあるやり方と違うところ","text":"よくあるやり方と違うところ","depth":3},{"id":"resnetresnextと比べる","text":"ResNet、ResNeXtと比べる","depth":3},{"id":"モバイル向けの計算量","text":"モバイル向けの計算量","depth":3},{"id":"efficientnetと比べる","text":"EfficientNetと比べる","depth":3},{"id":"結論","text":"結論","depth":2}],"anchorAliases":{},"guide":null,"relatedReading":[{"id":"classic-cnns/nasnet","relation":"referenced","topic":""},{"id":"classic-cnns/efficientnet","relation":"referenced","topic":""}]}],"text":"ショートカット接続には2つの方法があります。ResNetは入力を出力へ足して$x + f(x)$とし、DenseNetは入力と出力を連結して$[x, f(x)]$とします。\n\n2016年のDenseNetは、より少ないパラメータでResNetに追いつき、CVPR 2017の最優秀論文を受賞しました。しかし、その後のResNeXt、EfficientNet、ConvNeXt、ViT、Swinといった主流ネットワークは、ほぼすべて加算を使います。DenseNetは次第に構造の議論から遠ざかりました。\n\nこの論文はNAVER Cloud AIとNAVER AI LabのDonghyun Kim、Byeongho Heo、Dongyoon Hanによるものです。著者は、DenseNetが顧みられなくなった原因を、連結自体ではなく、古い学習方法と設計の細部に求めます。連結だけを残してほかを全面的に刷新し、どこまで進めるかを試します。\n\n\n> [!TIP]\n> \n> DenseNetの元の設計と、その一部の発想を借りたCSPNetについては、こちらの2本を読めます。\n> \n> - **[[16.08] DenseNet：すべて繋げる](/blog/papers/classic-cnns/densenet)**\n> - **[[19.11] CSPNet：半半半プラグイン](/blog/papers/classic-cnns/cspnet)**\n\n\n## 問題の定義\n\n### 加算と連結の違い\n\n加算するショートカットは出力の幅が一定です。何層積んでも特徴は$d$チャネルのままで、各層はこの$d$チャネルの内容を変更するだけです。\n\n連結するショートカットでは、1層ごとに$g$チャネル増えます。$g$はgrowth rate（以下GR）です。前のすべての層の特徴がそのまま残り、後の層から直接使えます。\n\n著者は行列のランクで利点を説明します。1層の出力$f(XW)$で、$X$を$N\\times d_{in}$の入力、$W$を$d_{in}\\times d_{out}$の重みとすると、非線形性を加えた出力のランクは通常$d_{out}$に近づきます。出力次元が高いほど表現力が増します。連結は$W=[W_P, I]$と書くことに相当し、元の$d_{in}$チャネルを保ち、$W_P$が生む$g$チャネルを足すので、ランクが積み上がります。\n\nここにDenseNetの古い問題もあります。チャネルが増え続け、メモリも膨らみます。そのため元のDenseNetは32などの小さなGRを使い、非常に深くしました。DenseNet-201は4つのdense blockに6、12、48、32層を持ちます。深くて細いネットワークはGPUで遅くなります。\n\n著者のもう1つの主張は、transition layerでチャネルを圧縮しても、圧縮後の次元を小さくしすぎなければランクは大きく落ちないというものです。頻繁な圧縮でメモリを抑えながら、表現力を保てます。\n\n### まず1万5千のランダムなネットワークを試す\n\n以上はまだ仮説なので、実験で確かめます。Tiny-ImageNetで1万5千以上のネットワークをランダムに作り、加算と連結の2群に分けます。深さ、幅、活性化関数、正規化、カーネルサイズもランダムです。計算予算内のものだけ学習するため、両接続の計算コストは近くなります。\n\n探索空間は5つで、A、B、Cは異なるサイズ、DはCにデータ拡張を加え、Eはさらに最適化器をAdamWへ変えます。\n\n| 空間 | 加算top-1 | 連結top-1 | 加算メモリ（GB） | 連結メモリ（GB） |\n| --- | ---: | ---: | ---: | ---: |\n| A（約2.2Mパラメータ） | 45.8 ± 2.0% | **47.5 ± 2.1%** | 0.65 | 0.75 |\n| B（約4.5M） | 50.1 ± 2.1% | **51.2 ± 2.1%** | 0.78 | 0.90 |\n| C（約9.5M） | 53.2 ± 2.2% | **54.3 ± 2.0%** | 1.01 | 1.24 |\n| D（Cにデータ拡張） | 57.4 ± 1.5% | **58.1 ± 1.4%** | 1.02 | 1.24 |\n| E（DをAdamWへ変更） | 58.2 ± 1.5% | **58.9 ± 1.6%** | 1.02 | 1.25 |\n\n*表：原論文Table 7より。各空間内の全ネットワークの平均と標準偏差。*\n\n5空間すべてで連結の平均が0.7〜1.7ポイント高くなりました。ただし標準偏差は約2ポイントあり、分布は大きく重なります。学習レシピを強めると差は1.1から0.7へ縮まります。一方、メモリは15〜23%多く、昔の問題は残っています。\n\n実験は64×64の小画像と1,000万パラメータ未満の小ネットワークによるものです。方向性は示せても、大きなネットワークにも当てはまるかは確認が必要です。そこでImageNetで実際に試します。\n\n\n> [!TIP]\n> \n> 多数のネットワークをランダムに抽出し、精度分布を比較する方法はRegNetの著者によるものです。\n> \n> - **[[20.03] RegNet：良いアーキテクチャはどれも似ている？](/blog/papers/classic-cnns/regnet)**\n\n\n## 問題の解決\n\n### DenseNet-201から1つずつ変える\n\n方法はConvNeXtに似ています。古いモデルから始め、1か所ずつ変えて精度と速度を記録します。DenseNet-201へAdamW、cosine学習率、300 epoch、各種データ拡張という現代のレシピを適用した出発点は、ImageNet 79.7%です。\n\n| 手順 | top-1 | パラメータ数 | FLOPs | 推論遅延（バッチ1） | 学習遅延 | 学習メモリ |\n| --- | ---: | ---: | ---: | ---: | ---: | ---: |\n| DenseNet-201（新レシピ） | 79.7% | 20.0M | 4.3G | 38.4 ms | 131 ms | 3.9 GB |\n| 広く浅くする | 79.5% | 21.8M | 11.1G | 8.5 ms | 85 ms | 3.2 GB |\n| 現代のブロックへ変更 | 80.4% | 12.9M | 4.8G | 10.4 ms | 112 ms | 3.4 GB |\n| 拡張率を入力に合わせる | 80.8% | 19.9M | 4.7G | 11.8 ms | 88 ms | 3.1 GB |\n| transitionを増やし、ステージごとにGRを変える | 82.3% | 21.2M | 5.0G | 11.0 ms | 90 ms | 3.4 GB |\n| patchify stem | 82.4% | 21.2M | 4.9G | 11.0 ms | 88 ms | 3.2 GB |\n| transitionを再設計 | 82.6% | 22.4M | 4.9G | 13.6 ms | 97 ms | 3.1 GB |\n| チャネルを再スケーリング | **82.8%** | 23.9M | 5.0G | 14.0 ms | 99 ms | 3.1 GB |\n\n*表：原論文Table 1の一部の列を抜粋。*\n\n順に見ていきます。\n\n**広く浅くする。** GRを32から120へ増やし、4ステージのブロック数を$(6, 12, 48, 32)$から$(3, 3, 12, 3)$へ減らします。精度はほぼ同じで、学習遅延は35%、メモリは18%減ります。FLOPsは11.1Gへ増え、後で対処します。\n\n**現代のブロックへ変更する。** ConvNeXtのように7×7 depthwise畳み込み、LayerNorm、1×1畳み込みによる拡張と圧縮を置き、正規化と活性化関数も減らします。違いは出力チャネルがGRで、入力より少ない点です。各ブロックは、それまで連結してきた特徴をGR個の新チャネルへ圧縮します。これで0.9ポイント上がります。\n\n**拡張率を入力に合わせる。** 元のDenseNetのボトルネック幅はGRの4倍です。著者は入力チャネル数の4倍へ変え、非線形性の前の特徴を豊かにします。GRを120から60へ半減して計算量を抑え、精度は0.4ポイント上がり、学習も21%速くなります。\n\n**transitionを増やす。** 元のDenseNetはステージ間だけにtransitionを置き、ダウンサンプリングも兼ねます。著者はステージ内にも3ブロックごとにstride 1のtransitionを置き、チャネルを半分にする役割に絞ります。節約した計算量でGRを上げ、各ステージで異なる値にします。これで1.5ポイント上がり、全手順中最大の改善です。\n\n最後の3つは小さな変更です。stemを4×4、stride 4のpatchifyへ変え、transitionの平均プーリングを除いてカーネルサイズとstrideが同じ畳み込みでダウンサンプリングし、チャネルの再スケーリング（layer scaleとeffective SE）を加えます。それぞれ0.1〜0.2ポイント上がります。\n\n[![原論文Fig. 1。上段左はRDNet全体で、Stem、Stage-1、Transition S/2、Stage-2、Transition S/2、Stage-3、Transition S/2、Stage-4、GlobalAvgPool、LayerNorm、FCの順。右のFeature mixer fはDW Conv 7×7（C→C）、LayerNorm、Linear（C→4C）、GeLU、Linear（4C→GR）。下段左はStage-Nの展開で、紫色の特徴ブロックがfを通るたび1枚増えて厚くなり、Transition S/1を接続する。この組をL_N回繰り返す。右のTransition layer S/sはLayerNormとstride sのs×s畳み込みで、チャネルを半減する。](/content/papers/assets/47b1a145d10885d762e8f5476e49d96dc1e35fdc1e3227a66162ec1bf6870710.png)](/content/papers/assets/47b1a145d10885d762e8f5476e49d96dc1e35fdc1e3227a66162ec1bf6870710.png)\n\n*Kimらの原論文Fig. 1。[**PDF 6ページ**](https://arxiv.org/pdf/2403.19588v2#page=6)より。原図のキャプションは省略。*\n\nこれが完成したRDNetです。下半分は1ステージの内部で、特徴混合器$f$を通るたび紫色の板が1枚増えます。3つの$f$の後にstride 1のtransitionで厚さを半分へ戻し、この組を$L_N$回繰り返します。\n\n### チャネル数を追う\n\n図だけでは変化がつかみにくいので、timmの実装を使います。`rdnet_tiny`から`rdnet_large`まで事前学習済み重みがありますが、ここでは重みをダウンロードせずRDNet-Tの構造だけを作り、各ブロック群のチャネル数を表示します。\n\n```python\nimport timm\nimport torch.nn as nn\n\nmodel = timm.create_model(\"rdnet_tiny\", pretrained=False)    # 構造だけを作り、重みはダウンロードしない\nprint(\"stemの出力\", model.stem[0].out_channels, \"チャネル\")\nfor i, group in enumerate(model.dense_stages):\n    *transition, dense = group.children()\n    if transition:                                            # 群の間のtransition：LayerNorm + 畳み込み\n        conv = transition[1]\n        kind = \"ダウンサンプリング\" if conv.stride[0] == 2 else \"チャネルのみ圧縮\"\n        print(f\"  transition（{kind}） {conv.in_channels} → {conv.out_channels}\")\n    blocks = list(dense.children())\n    c_in = blocks[0].layers.layers[0].in_channels             # 最初のブロックの7×7 depthwiseに入るチャネル数\n    gr = blocks[0].growth_rate\n    print(f\"第{i}群 {len(blocks)}ブロック、各ブロックで{gr}チャネルを連結  {c_in} → {c_in + len(blocks) * gr}\")\n```\n\n```text\nstemの出力 64 チャネル\n第0群 3ブロック、各ブロックで64チャネルを連結  64 → 256\n  transition（ダウンサンプリング） 256 → 128\n第1群 3ブロック、各ブロックで104チャネルを連結  128 → 440\n  transition（ダウンサンプリング） 440 → 216\n第2群 3ブロック、各ブロックで128チャネルを連結  216 → 600\n  transition（チャネルのみ圧縮） 600 → 296\n第3群 3ブロック、各ブロックで128チャネルを連結  296 → 680\n  transition（チャネルのみ圧縮） 680 → 336\n第4群 3ブロック、各ブロックで128チャネルを連結  336 → 720\n  transition（チャネルのみ圧縮） 720 → 360\n第5群 3ブロック、各ブロックで128チャネルを連結  360 → 744\n  transition（ダウンサンプリング） 744 → 368\n第6群 3ブロック、各ブロックで224チャネルを連結  368 → 1040\n```\n\ntimmは3ブロックを1群にまとめます。第2〜第5群が論文の第3ステージで、計12ブロックです。各群の終わりでチャネルが増え、transitionで半分へ戻るので、第3ステージの幅は216〜744を行き来します。\n\n第3ステージの途中にtransitionがなければどうなるでしょうか。同じ数値で本稿が概算します。最も高価なのは各ブロックの2つの1×1畳み込みで、入力の4倍へ拡張し、GRへ圧縮します。1位置当たりの積和演算数は約$4c^2 + 4c\\cdot\\mathrm{GR}$です。\n\n```python\ndef stage3(every, c=216, gr=128, blocks=12):\n    macs = 0\n    for b in range(blocks):\n        if b and b % every == 0:\n            c = int(c * 0.5 / 8) * 8                          # transitionでチャネルを半分へ圧縮\n        macs += c * 4 * c + 4 * c * gr                        # 1位置ごとに1×1で4倍へ拡張し、GRへ圧縮\n        c += gr                                               # 出力を後ろへ連結\n    return macs, c\n\nfor every, label in ((3, \"3ブロックごとに圧縮\"), (6, \"6ブロックごとに圧縮\"), (12, \"途中で圧縮しない\")):\n    macs, c = stage3(every)\n    print(f\"{label}：最終{c}チャネル、2つの1×1畳み込みの1位置当たり積和演算数{macs / 1e6:.1f}M\")\n```\n\n```text\n3ブロックごとに圧縮：最終744チャネル、2つの1×1畳み込みの1位置当たり積和演算数12.2M\n6ブロックごとに圧縮：最終1256チャネル、2つの1×1畳み込みの1位置当たり積和演算数29.0M\n途中で圧縮しない：最終1752チャネル、2つの1×1畳み込みの1位置当たり積和演算数55.7M\n```\n\nここではdepthwise畳み込みとSEを省き、主要部分だけを数えています。transitionがなければ最後は1752チャネルとなり、計算量は3ブロックごとに圧縮する場合の4.6倍です。拡張層のコストはチャネル数の2乗に比例するので、連結でチャネルが線形に増えても、計算量は2乗で増えます。頻繁に圧縮するからこそGRを高くできます。\n\n論文のアブレーションもこの間隔を支持します。同程度の計算量で、2ブロックごとの圧縮は82.7%、3つごとは82.8%、4つごとは82.6%、6つごとは82.1%です。\n\n## 考察\n\n### ImageNet\n\n代表的なモデルと比べます。すべてImageNet-1Kだけで学習し、遅延は128枚まとめて推論、メモリはバッチ16で測定します。\n\n| モデル | パラメータ数 | FLOPs | 遅延（ms） | メモリ（GB） | top-1 |\n| --- | ---: | ---: | ---: | ---: | ---: |\n| Swin-T | 28M | 4.5G | 173 | 2.6 | 81.3% |\n| ConvNeXt-T | 29M | 4.5G | 150 | 2.7 | 82.1% |\n| InceptionNeXt-T | 28M | 4.2G | 132 | 3.3 | 82.3% |\n| RDNet-T | 24M | 5.0G | 175 | 4.1 | **82.8%** |\n| ConvNeXt-S | 50M | 8.7G | 266 | 4.0 | 83.1% |\n| RDNet-S | 50M | 8.7G | 289 | 5.4 | **83.7%** |\n| ConvNeXt-B | 89M | 15.4G | 417 | 5.4 | 83.8% |\n| RDNet-B | 87M | 15.4G | 472 | 6.9 | **84.4%** |\n\n*表：原論文Table 4の一部の行を抜粋。*\n\nRDNetは各サイズでConvNeXtより0.6〜0.7ポイント高い一方、推論遅延が約1〜2割、メモリが約3〜5割増えます。連結は前の特徴をすべて保つので、やはりメモリを使います。\n\n著者は2022〜2024年のHorNet、VAN、BiFormer、NAT、SMT、MogaNetとも比較します。こちらでは状況が逆で、RDNet-Tは同規模で精度が同等か最大1ポイント低い一方、バッチ1の遅延は7.4 ms、他モデルは20〜52 msです。表の説明でも、精度はやや劣るが速度で補うと明記しています。\n\n### 下流タスク\n\nセグメンテーションと物体検出では差がより明確です。ADE20KのUperNetで、RDNet-TのシングルスケールmIoUは47.6、ConvNeXt-Tは46.0、Bでは49.6対49.1です。COCOのMask R-CNNを3倍スケジュールで学習すると、RDNet-Tのbox APは47.5、ConvNeXt-Tは46.2で、パラメータは5M少なくなります。著者は異なる層の特徴を保持する連結が、密な予測に役立つと考えています。\n\nOpenCLIPでCLIPも学習し、画像エンコーダにRDNet-BとConvNeXt-Bを使うと、ImageNetゼロショット分類のtop-1は54.1%対51.2%でした。\n\n### stochastic depthも役立つ\n\n元のDenseNetはstochastic depthを使っていません。著者によれば、もともとの接続パターンに似た部分があるためです。しかし試すと影響は大きく、率0では81.6%、0.15では82.8%と、1.2ポイント上がりました。\n\n\n> [!TIP]\n> \n> stochastic depthがランダムに層を「休ませる」方法は、こちらで読めます。\n> \n> - **[[16.03] Stochastic Depth：今日はこの層がお休み](/blog/papers/classic-cnns/stochastic-depth)**\n\n\n## 結論\n\n最後に整理します。\n\n1. **連結そのもの**：1万5千のランダムネットワークでは、加算より平均0.7〜1.7ポイント高く、メモリも1〜2割増えます。\n2. **DenseNetを強くする体形**：広く浅くすると高速化し、transitionを増やすとGRを高くできます。後者だけで1.5ポイント上がります。\n3. **成績**：同規模のConvNeXtより0.6〜0.7ポイント高く、セグメンテーションと物体検出ではさらに差が開きます。推論は少し遅く、メモリは3〜5割増えます。\n\nこう見ると、DenseNetが顧みられなくなった原因の多くは、深くて細い体形と古い学習レシピにあり、連結自体は悪くなかったようです。ただし必要なメモリは、2016年から今までずっと多いままです。\n","imageSizes":{"/content/papers/assets/47b1a145d10885d762e8f5476e49d96dc1e35fdc1e3227a66162ec1bf6870710.png":{"width":1230,"height":615}}}
