{"notes":[{"id":"lightweight/cbam","category":"lightweight","legacyPath":"","legacySlug":"","legacyPaths":[],"title":"CBAM","subtitle":"どこを見てるの？","author":"Z. Yuan","paperDate":"2018-07-17","publishedOn":"2024-07-31","world":"external/cbam","paperTitle":"CBAM: Convolutional Block Attention Module","paperUrl":"https://arxiv.org/abs/1807.06521","bibliography":{"title":"CBAM: Convolutional Block Attention Module","authors":["Sanghyun Woo","Jongchan Park","Joon-Young Lee","In So Kweon"],"url":"https://arxiv.org/abs/1807.06521","pdfUrl":"https://arxiv.org/pdf/1807.06521v2","codeUrl":null,"preprint":{"id":"1807.06521","submittedOn":"2018-07-17","url":"https://arxiv.org/abs/1807.06521"},"publication":{"venue":"ECCV","year":2018,"kind":"conference","url":"https://openaccess.thecvf.com/content_ECCV_2018/html/Sanghyun_Woo_Convolutional_Block_Attention_ECCV_2018_paper.html"},"citation":"@misc{lightweightcbam2018,\n  title = {{CBAM: Convolutional Block Attention Module}},\n  author = {Sanghyun Woo and Jongchan Park and Joon-Young Lee and In So Kweon},\n  year = {2018},\n  eprint = {1807.06521},\n  archivePrefix = {arXiv},\n  url = {https://arxiv.org/abs/1807.06521}\n}\n","citationPath":"/content/papers/citations/lightweight/cbam.bf1587b50fdf.bib"},"thumbnail":{"src":"/content/papers/assets/c62baa4fde1b39b59d98582de01b1a1303f006289a91791c235dfc69e88ec40b.png","width":1395,"height":713},"locale":"ja","path":"/content/papers/ja/lightweight/cbam.7ba0bab26b49.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":2},{"id":"設計が一歩ずつ決まっていく過程","text":"設計が一歩ずつ決まっていく過程","depth":3},{"id":"さまざまなネットワークでの結果","text":"さまざまなネットワークでの結果","depth":3},{"id":"検出","text":"検出","depth":3},{"id":"モデルはどこを見ているか","text":"モデルはどこを見ているか","depth":3},{"id":"結論","text":"結論","depth":2}],"anchorAliases":{},"guide":null,"relatedReading":[{"id":"lightweight/senet","relation":"referenced","topic":""},{"id":"classic-cnns/wide-resnet","relation":"referenced","topic":""},{"id":"classic-cnns/xception","relation":"referenced","topic":""}]},{"id":"lightweight/senet","category":"lightweight","legacyPath":"lightweight/1709-senet","legacySlug":"1709-senet","legacyPaths":[],"title":"SENet","subtitle":"強く絞ってください","author":"Z. Yuan","paperDate":"2017-09-05","publishedOn":"2024-06-28","paperTitle":"Squeeze-and-Excitation Networks","paperUrl":"https://arxiv.org/abs/1709.01507","bibliography":{"title":"Squeeze-and-Excitation Networks","authors":["Jie Hu","Li Shen","Samuel Albanie","Gang Sun","Enhua Wu"],"url":"https://arxiv.org/abs/1709.01507","pdfUrl":"https://arxiv.org/pdf/1709.01507","codeUrl":null,"preprint":{"id":"1709.01507","submittedOn":"2017-09-05","url":"https://arxiv.org/abs/1709.01507"},"publication":{"venue":"CVPR","year":2018,"kind":"conference","url":"https://arxiv.org/abs/1709.01507"},"citation":"@misc{lightweightsenet2017,\n  title = {{Squeeze-and-Excitation Networks}},\n  author = {Jie Hu and Li Shen and Samuel Albanie and Gang Sun and Enhua Wu},\n  year = {2017},\n  eprint = {1709.01507},\n  archivePrefix = {arXiv},\n  url = {https://arxiv.org/abs/1709.01507}\n}\n","citationPath":"/content/papers/citations/lightweight/senet.1766a7978dde.bib"},"thumbnail":{"src":"/content/papers/assets/322f16ed8c782ffbdd7d7db3e8292c991908e3543dc69e1addd9238e22484363.jpg","width":1688,"height":394},"locale":"ja","path":"/content/papers/ja/lightweight/senet.73180da00315.md","headings":[{"id":"問題の定義","text":"問題の定義","depth":2},{"id":"問題の解決","text":"問題の解決","depth":2},{"id":"モデルアーキテクチャ","text":"モデルアーキテクチャ","depth":3},{"id":"討論","text":"討論","depth":2},{"id":"画像分類の効果の表示","text":"画像分類の効果の表示","depth":3},{"id":"軽量モデルでの効果の表示","text":"軽量モデルでの効果の表示","depth":3},{"id":"squeeze-の重要性","text":"Squeeze の重要性","depth":3},{"id":"excitation-の重要性","text":"Excitation の重要性","depth":3},{"id":"その他の実験結果","text":"その他の実験結果","depth":3},{"id":"結論","text":"結論","depth":2}],"anchorAliases":{},"guide":null,"relatedReading":[{"id":"lightweight/mobilenet-v3","relation":"comparison","topic":"軽量ネットワークのチャネル Attention"},{"id":"lightweight/pp-lcnet","relation":"comparison","topic":"軽量ネットワークのチャネル Attention"}]},{"id":"classic-cnns/wide-resnet","category":"classic-cnns","legacyPath":"","legacySlug":"","legacyPaths":[],"title":"Wide ResNet","subtitle":"深さより幅","author":"Z. Yuan","paperDate":"2016-05-23","publishedOn":"2024-02-14","world":"external/wide-resnet","paperTitle":"Wide Residual Networks","paperUrl":"https://arxiv.org/abs/1605.07146","bibliography":{"title":"Wide Residual Networks","authors":["Sergey Zagoruyko","Nikos Komodakis"],"url":"https://arxiv.org/abs/1605.07146","pdfUrl":"https://arxiv.org/pdf/1605.07146v4","codeUrl":null,"preprint":{"id":"1605.07146","submittedOn":"2016-05-23","url":"https://arxiv.org/abs/1605.07146"},"publication":{"venue":"BMVC","year":2016,"kind":"conference","url":"https://doi.org/10.5244/C.30.87"},"citation":"@misc{classiccnnswideresnet2016,\n  title = {{Wide Residual Networks}},\n  author = {Sergey Zagoruyko and Nikos Komodakis},\n  year = {2016},\n  eprint = {1605.07146},\n  archivePrefix = {arXiv},\n  url = {https://arxiv.org/abs/1605.07146}\n}\n","citationPath":"/content/papers/citations/classic-cnns/wide-resnet.2e42de74f658.bib"},"thumbnail":{"src":"/content/papers/assets/eb123078c88654918b04d17b5ebccd1009fc7fbc33305ebd9ba853f2ad2cc024.png","width":1400,"height":500},"locale":"ja","path":"/content/papers/ja/classic-cnns/wide-resnet.ea87ec881366.md","headings":[{"id":"問題の定義","text":"問題の定義","depth":2},{"id":"どんどん細くなるresnet","text":"どんどん細くなるResNet","depth":3},{"id":"ショートカットが通りやすすぎる","text":"ショートカットが通りやすすぎる","depth":3},{"id":"細長いネットワークは速くもない","text":"細長いネットワークは速くもない","depth":3},{"id":"問題の解決","text":"問題の解決","depth":2},{"id":"動かせるところ","text":"動かせるところ","depth":3},{"id":"wrn-n-k","text":"WRN-n-k","depth":3},{"id":"ブロックの中に何を置くか","text":"ブロックの中に何を置くか","depth":3},{"id":"dropoutをブロックに入れる","text":"dropoutをブロックに入れる","depth":3},{"id":"考察","text":"考察","depth":2},{"id":"幅と深さをどう配分するか","text":"幅と深さをどう配分するか","depth":3},{"id":"1000層のresnetと比べる","text":"1000層のResNetと比べる","depth":3},{"id":"広いほうが速い","text":"広いほうが速い","depth":3},{"id":"dropoutの効果","text":"dropoutの効果","depth":3},{"id":"imagenetでは中央の層を広げる","text":"ImageNetでは中央の層を広げる","depth":3},{"id":"結論","text":"結論","depth":2}],"anchorAliases":{},"guide":null,"relatedReading":[{"id":"classic-cnns/resnet-v2","relation":"referenced","topic":""},{"id":"classic-cnns/stochastic-depth","relation":"referenced","topic":""}]},{"id":"classic-cnns/xception","category":"classic-cnns","legacyPath":"","legacySlug":"","legacyPaths":[],"title":"Xception","subtitle":"Inceptionの果て","author":"Z. Yuan","paperDate":"2016-10-07","publishedOn":"2024-03-20","world":"external/xception","paperTitle":"Xception: Deep Learning with Depthwise Separable Convolutions","paperUrl":"https://arxiv.org/abs/1610.02357","bibliography":{"title":"Xception: Deep Learning with Depthwise Separable Convolutions","authors":["François Chollet"],"url":"https://arxiv.org/abs/1610.02357","pdfUrl":"https://arxiv.org/pdf/1610.02357v3","codeUrl":null,"preprint":{"id":"1610.02357","submittedOn":"2016-10-07","url":"https://arxiv.org/abs/1610.02357"},"publication":{"venue":"CVPR","year":2017,"kind":"conference","url":"https://openaccess.thecvf.com/content_cvpr_2017/html/Chollet_Xception_Deep_Learning_CVPR_2017_paper.html"},"citation":"@misc{classiccnnsxception2016,\n  title = {{Xception: Deep Learning with Depthwise Separable Convolutions}},\n  author = {François Chollet},\n  year = {2016},\n  eprint = {1610.02357},\n  archivePrefix = {arXiv},\n  url = {https://arxiv.org/abs/1610.02357}\n}\n","citationPath":"/content/papers/citations/classic-cnns/xception.3a6fa7188c36.bib"},"thumbnail":{"src":"/content/papers/assets/b56e8b540dd5a4cb9856460b3e47a6e3e624df308ab08b70809438075caf5f0a.png","width":917,"height":538},"locale":"ja","path":"/content/papers/ja/classic-cnns/xception.f8b2466408bf.md","headings":[{"id":"問題の定義","text":"問題の定義","depth":2},{"id":"問題の解決","text":"問題の解決","depth":2},{"id":"inceptionモジュールを別の角度から見る","text":"Inceptionモジュールを別の角度から見る","depth":3},{"id":"とことん分ける","text":"とことん分ける","depth":3},{"id":"スペクトルのもう一方の端","text":"スペクトルのもう一方の端","depth":3},{"id":"xception","text":"Xception","depth":3},{"id":"考察","text":"考察","depth":2},{"id":"imagenet","text":"ImageNet","depth":3},{"id":"jft","text":"JFT","depth":3},{"id":"パラメータはほぼ同じで少し遅い","text":"パラメータはほぼ同じで、少し遅い","depth":3},{"id":"残差接続","text":"残差接続","depth":3},{"id":"あいだに活性化関数を入れるべきか","text":"あいだに活性化関数を入れるべきか","depth":3},{"id":"結論","text":"結論","depth":2}],"anchorAliases":{},"guide":null,"relatedReading":[{"id":"classic-cnns/inception-v1","relation":"referenced","topic":""},{"id":"classic-cnns/inception-v3","relation":"referenced","topic":""},{"id":"lightweight/mobilenet-v1","relation":"referenced","topic":""}]}],"text":"2017年、SENetはILSVRCの最後の大会で分類部門の優勝を勝ち取りました。各畳み込みブロックの後ろにとても小さなモジュールを加え、まず各チャネルを平均して1つの数にし、次に全結合層2層で各チャネルの重みを計算して、元の特徴マップに掛け戻します。パラメータはほんの少し増えるだけで、正解率は大きく上がりました。\n\n\n> [!TIP]\n> \n> SENetは、先に私たちのノートで読めます。\n> \n> - **[[17.09] SENet：強く絞ってください](/blog/papers/lightweight/senet)**\n\n\n韓国のKAIST、Lunit、そしてアメリカのAdobe ResearchのSanghyun Wooらは、SENetを土台にさらに問いを重ねました。チャネルの重みは平均値だけを見て決めればよいのか？「どのチャネルを見るか」に加えて、「どの位置を見るか」も決めるべきではないか？\n\n## 問題の定義\n\n著者らは、ネットワーク設計のいくつかの方向から話を始めます。ネットワークはVGGやResNetのように深くすることも、Wide ResNetのように広くすることも、XceptionやResNeXtのように基数（cardinality）を増やすこともできます。この三つの方向については私たちもノートを書いているので、[Wide ResNet](/blog/papers/classic-cnns/wide-resnet)、[Xception](/blog/papers/classic-cnns/xception)、[ResNeXt](/blog/papers/classic-cnns/resnext)を参照してください。\n\n著者らは別の方向、つまり注意機構から取り組もうと考えました。ネットワークに重要な特徴を強調させ、不要なものを抑えさせるのです。\n\n畳み込みはもともとチャネルと空間の情報を同時に混ぜ合わせるので、著者らは注意もこの二つの方向に沿って働かせます。チャネル注意は「何を見るか」を決めます。各チャネルは一種の特徴検出器とみなせるからです。空間注意は「どこを見るか」を決めます。\n\nSENetが扱ったのはチャネルの側の半分だけで、しかも情報を集めるのに平均プーリングしか使っていません。著者らはこの2点にはまだ改善の余地があると考え、同時に、モジュールを軽量に保ち、どんな畳み込みネットワークにもそのまま差し込めるようにしたいと考えました。\n\n## 問題の解決\n\n### 全体の構造\n\n[![CBAMの全体構造。Input FeatureはまずChannel Attention Moduleに入り、生成されたチャネル注意が入力と掛け合わされる。その結果がSpatial Attention Moduleに入り、生成された空間注意がもう一度掛け合わされて、Refined Featureが得られる](/content/papers/assets/6bb23fb7d2af72e07e37ef41762e65dd79a4f36a6b6309ea002c27127650f5bd.png)](/content/papers/assets/6bb23fb7d2af72e07e37ef41762e65dd79a4f36a6b6309ea002c27127650f5bd.png)\n\n*原論文Fig. 1。[**v2 PDFの2ページ**](https://arxiv.org/pdf/1807.06521v2#page=2)から抜粋。CBAMは、チャネルと空間の二つのサブモジュールを順につないだものです。*\n\n中間の特徴マップ$\\mathbf{F}\\in\\mathbb{R}^{C\\times H\\times W}$が与えられると、CBAMはまず1Dのチャネル注意$\\mathbf{M_c}\\in\\mathbb{R}^{C\\times1\\times1}$を計算し、次に2Dの空間注意$\\mathbf{M_s}\\in\\mathbb{R}^{1\\times H\\times W}$を計算します。\n\n$$\n\\mathbf{F}'=\\mathbf{M_c}(\\mathbf{F})\\otimes\\mathbf{F},\\qquad\n\\mathbf{F}''=\\mathbf{M_s}(\\mathbf{F}')\\otimes\\mathbf{F}'.\n$$\n\n$\\otimes$は要素ごとの積で、形の違うところはブロードキャストで補います。チャネル注意はチャネルごとに1つの数なので、掛けるときは平面全体に複製されます。空間注意は位置ごとに1つの数なので、掛けるときはすべてのチャネルに複製されます。\n\n[![二つのサブモジュールの詳細。上の緑の枠はChannel Attention Moduleで、Input feature FがMaxPoolとAvgPoolをそれぞれ通って2つのベクトルになり、どちらも同じShared MLPに送られる。2つの出力を足し合わせてからsigmoidを通すと、Channel Attention Mcが得られる。下の紫の枠はSpatial Attention Moduleで、Channel-refined feature F'をチャネル方向にMaxPoolとAvgPoolして2枚のマップに重ね、conv layer 1層とsigmoidを通すと、Spatial Attention Msが得られる](/content/papers/assets/c62baa4fde1b39b59d98582de01b1a1303f006289a91791c235dfc69e88ec40b.png)](/content/papers/assets/c62baa4fde1b39b59d98582de01b1a1303f006289a91791c235dfc69e88ec40b.png)\n\n*原論文Fig. 2。[**v2 PDFの5ページ**](https://arxiv.org/pdf/1807.06521v2#page=5)から抜粋。チャネル注意と空間注意のサブモジュールです。*\n\n二つのサブモジュールのやり方はとても対称的で、どちらもまずある方向に沿って平均プーリングと最大プーリングを行って情報を圧縮し、それから小さなネットワークで注意を計算します。一つずつ見ていきましょう。\n\n### チャネル注意\n\nチャネル注意では、各チャネルの$H\\times W$個の値を1つの数に圧縮します。SENetは平均プーリングを使っていましたが、著者らは最大プーリングも加えるべきだと考えます。\n\nなぜでしょうか？極端な例で見てみましょう。チャネルが2つあり、一方は$10\\times10$の全体でどこも0.1、もう一方は1か所だけが10で、ほかはすべて0だとします。\n\n```python\nimport torch\n\nflat = torch.full((10, 10), 0.1)                   # チャネルA：どこも0.1\npeak = torch.zeros(10, 10); peak[3, 6] = 10.0       # チャネルB：1か所だけがとても明るい\nF = torch.stack([flat, peak])                      # [C=2, H=10, W=10]\n\nprint(\"平均プーリング：\", [round(v, 4) for v in F.mean(dim=(1, 2)).tolist()])\nprint(\"最大プーリング：\", [round(v, 4) for v in F.amax(dim=(1, 2)).tolist()])\n```\n\n```text\n平均プーリング： [0.1, 0.1]\n最大プーリング： [0.1, 10.0]\n```\n\n平均値だけを見ると、二つのチャネルはまったく同じです。最大値を見れば、2つ目のチャネルがどこかで強く反応していることがわかります。著者らの言い方では、平均プーリングは穏やかな大域統計を与え、最大プーリングは最も目立つ部分がどれだけ強いかを記録するので、両者は補い合えます。\n\n二つのプーリングの結果は**同じ**MLPに送られ、出力を足してからsigmoidを通します。\n\n$$\n\\mathbf{M_c}(\\mathbf{F})=\\sigma\\big(\\mathrm{MLP}(\\mathrm{AvgPool}(\\mathbf{F}))+\\mathrm{MLP}(\\mathrm{MaxPool}(\\mathbf{F}))\\big).\n$$\n\nMLPは隠れ層が1層だけで、その大きさは$C/r$です。$r$は縮小率で、SENetと同じく16にします。同じMLPを共有するので、パラメータ数はSENetと同じです。\n\n### 空間注意\n\n空間注意はその逆で、**チャネル**方向に沿って平均プーリングと最大プーリングを行います。各位置にはもともと$C$個の値がありますが、それを2つの数に圧縮するので、画像全体は2枚の$H\\times W$の記述マップになります。これを重ねて$7\\times7$畳み込みを1層通し、さらにsigmoidを通します。\n\n$$\n\\mathbf{M_s}(\\mathbf{F})=\\sigma\\big(f^{7\\times7}([\\mathrm{AvgPool}(\\mathbf{F});\\mathrm{MaxPool}(\\mathbf{F})])\\big).\n$$\n\n### 組み合わせる\n\n二つのサブモジュールを書き出して、256チャネル、$14\\times14$の特徴マップを一度通してみましょう。\n\n```python\nimport torch\nimport torch.nn as nn\n\nclass ChannelAttention(nn.Module):\n    def __init__(self, C, r=16):\n        super().__init__()\n        self.mlp = nn.Sequential(nn.Linear(C, C // r), nn.ReLU(), nn.Linear(C // r, C))   # 共有のMLP\n\n    def forward(self, F):\n        avg = F.mean(dim=(2, 3))                  # [B, C]\n        mx = F.amax(dim=(2, 3))                   # [B, C]\n        Mc = torch.sigmoid(self.mlp(avg) + self.mlp(mx))\n        print(\"  チャネル注意 Mc：\", tuple(Mc[:, :, None, None].shape))\n        return Mc[:, :, None, None]               # [B, C, 1, 1]\n\nclass SpatialAttention(nn.Module):\n    def __init__(self, k=7):\n        super().__init__()\n        self.conv = nn.Conv2d(2, 1, k, padding=k // 2)\n\n    def forward(self, F):\n        avg = F.mean(dim=1, keepdim=True)         # [B, 1, H, W]\n        mx = F.amax(dim=1, keepdim=True)          # [B, 1, H, W]\n        desc = torch.cat([avg, mx], dim=1)        # [B, 2, H, W]\n        Ms = torch.sigmoid(self.conv(desc))\n        print(\"  空間記述子：\", tuple(desc.shape), \"→ 空間注意 Ms：\", tuple(Ms.shape))\n        return Ms\n\nclass CBAM(nn.Module):\n    def __init__(self, C, r=16):\n        super().__init__()\n        self.channel, self.spatial = ChannelAttention(C, r), SpatialAttention()\n\n    def forward(self, F):\n        F1 = self.channel(F) * F                  # 式(1)：まずチャネル注意を掛ける\n        F2 = self.spatial(F1) * F1                # 次に空間注意を掛ける\n        return F2\n\nF = torch.randn(2, 256, 14, 14)\ncbam = CBAM(256)\nout = cbam(F)\nprint(\"出力：\", tuple(out.shape))\nprint(f\"チャネル部分のパラメータ{sum(p.numel() for p in cbam.channel.parameters()):,}、空間部分のパラメータ{sum(p.numel() for p in cbam.spatial.parameters()):,}\")\n```\n\n```text\n  チャネル注意 Mc： (2, 256, 1, 1)\n  空間記述子： (2, 2, 14, 14) → 空間注意 Ms： (2, 1, 14, 14)\n出力： (2, 256, 14, 14)\nチャネル部分のパラメータ8,464、空間部分のパラメータ99\n```\n\n出力は入力と同じ形なので、CBAMはどこにでも差し込めます。パラメータはほぼすべてチャネル部分のMLP（$256\\to16\\to256$）にあり、空間部分は$2\\to1$の$7\\times7$畳み込みが1つだけで、パラメータは99個です。\n\nResNetに組み込むときは、CBAMを各残差ブロックの畳み込みの出力に付け、処理してからショートカットと足し合わせます。位置はSENetと同じです。timmにも既製の実装があり、`timm.layers.create_attn(\"cbam\", channels)`で`CbamModule`が返されます。\n\n## 考察\n\n特に断りのない限り、実験はImageNet-1Kで行い、検証セットのシングルクロップ誤り率を報告しています。すべてのネットワークは著者ら自身がPyTorchで学習し直したもので、SENetも含みます。表のSEの数字は彼らが再現した結果で、SENetの論文が報告した数字とは完全には一致しません。\n\n### 設計が一歩ずつ決まっていく過程\n\n著者らはまずResNet-50を固定し、チャネル注意の計算方法、空間注意の計算方法、そして二つの組み合わせ方を順に決めていきます。\n\n**チャネル注意にどのプーリングを使うか**。この実験はチャネル注意だけを使い、$r=16$です。\n\n| 設定 | Top-1誤り率 | Top-5誤り率 |\n| --- | ---: | ---: |\n| ResNet-50 | 24.56% | 7.50% |\n| ＋平均プーリング（つまりSE） | 23.14% | 6.70% |\n| ＋最大プーリング | 23.20% | 6.83% |\n| ＋平均と最大プーリング | **22.80%** | **6.52%** |\n\n*表：原論文Table 1から抜粋。*\n\n最大プーリングだけでも、効果は平均プーリングとほぼ同じです。両方を一緒に使うのが最も良く、SEより0.34ポイント低くなり、パラメータ数は増えていません。\n\n**空間注意をどう計算するか**。前のステップのチャネル注意の後ろにつなぎ、記述マップを作る二つの方法を比べます。著者らが提案するチャネル方向のプーリングと、$1\\times1$畳み込み1層でチャネルを1つに圧縮する方法です。カーネルサイズは3と7を比べます。\n\n| 設定 | Top-1誤り率 | Top-5誤り率 |\n| --- | ---: | ---: |\n| チャネル注意のみ | 22.80% | 6.52% |\n| ＋空間（$1\\times1$畳み込み、$k=3$） | 22.96% | 6.64% |\n| ＋空間（$1\\times1$畳み込み、$k=7$） | 22.90% | 6.47% |\n| ＋空間（平均と最大プーリング、$k=3$） | 22.68% | 6.41% |\n| ＋空間（平均と最大プーリング、$k=7$） | **22.66%** | **6.31%** |\n\n*表：原論文Table 2から抜粋。*\n\n$1\\times1$畳み込みで記述マップを作る二つの版は、top-1がチャネル注意だけのときよりかえって悪くなります。チャネル方向にプーリングして初めて改善が出ます。カーネルは大きいほうが良く、著者らの説明では、どこが重要かを判断するには広い視野が必要だからです。\n\n**二つのサブモジュールをどう並べるか**。\n\n| 並べ方 | Top-1誤り率 | Top-5誤り率 |\n| --- | ---: | ---: |\n| チャネルのみ（SE） | 23.14% | 6.70% |\n| チャネルが先、空間が後 | **22.66%** | **6.31%** |\n| 空間が先、チャネルが後 | 22.78% | 6.42% |\n| 並列、足してからsigmoid | 22.95% | 6.59% |\n\n*表：原論文Table 3から抜粋。*\n\n順につなぐほうが並列より良く、チャネルを先、空間を後にするほうがさらにわずかに良くなります。これが最終的なCBAMです。\n\n三つの表を通して見ると、SEの23.14%からCBAMの22.66%まで、合わせて0.48ポイント改善しています。そのうち0.34はチャネル注意に追加した最大プーリングによるもので、空間注意がさらに0.14を上乗せしています。\n\n### さまざまなネットワークでの結果\n\n続いて、CBAMをさまざまなネットワークに差し込み、元の版、SEを加えた版と比べます。\n\n| ネットワーク | 元の版 | ＋SE | ＋CBAM | パラメータ（元の版 → モジュール追加） |\n| --- | ---: | ---: | ---: | ---: |\n| ResNet-18 | 29.60% | 29.41% | **29.27%** | 11.69M → 11.78M |\n| ResNet-34 | 26.69% | 26.13% | **25.99%** | 21.80M → 21.96M |\n| ResNet-50 | 24.56% | 23.14% | **22.66%** | 25.56M → 28.09M |\n| ResNet-101 | 23.38% | 22.35% | **21.51%** | 44.55M → 49.33M |\n| WideResNet-18（1.5倍の幅） | 26.85% | 26.21% | **26.10%** | 25.88M → 26.08M |\n| WideResNet-18（2倍の幅） | 25.63% | 24.93% | **24.84%** | 45.62M → 45.97M |\n| ResNeXt-50（32×4d） | 22.85% | **21.91%** | 21.92% | 25.03M → 27.56M |\n| ResNeXt-101（32×4d） | 21.54% | 21.17% | **21.07%** | 44.18M → 48.96M |\n\n*表：原論文Table 4から抜粋。ImageNet-1Kのtop-1誤り率です。SEとCBAMのパラメータ数はほぼ同じなので、ここではCBAMのものを載せています。*\n\nCBAMはどのネットワークでも元の版より良く、大半ではSEよりも良くなっています。差が最も大きいのはResNet-101（SEより0.84ポイント低い）です。ResNeXt-50ではSEと互角でした。計算量の増加はごくわずかで、ResNet-50では3.858 GFLOPsから3.864になります。\n\n著者らは軽量なMobileNetも試しています。元のMobileNetのtop-1誤り率は31.39%、SEを加えると29.97%、CBAMを加えると29.01%です。幅を0.7倍に縮めた版では、三つはそれぞれ34.86%、32.50%、31.51%でした。\n\n### 検出\n\nCOCOでFaster R-CNNを使い、バックボーンにCBAMを加えると、ResNet-50のmAP@[.5:.95]は27.0から28.1に、ResNet-101は29.1から30.8に上がりました。\n\nVOC 2007では、著者らはCBAMを検出器の中に置くことにし、SSDをベースにしたStairNetで各分類器の前に1つずつ加えました。VGG16バックボーンのmAP@0.5は78.9から79.3に（SEを加えると79.1）、MobileNetバックボーンでは70.1から70.5に（SEを加えると70.0）上がっています。検出での改善は、おおむね0.4〜1.7ポイントの範囲です。\n\n### モデルはどこを見ているか\n\n著者らはGrad-CAMで、ネットワークが判断するときに見ている領域を描き出しました。Grad-CAMはCAMを一般化したもので、勾配を使って各位置があるクラスにとってどれだけ重要かを計算し、ネットワークの末尾がグローバル平均プーリングである必要はありません。\n\n\n> [!TIP]\n> \n> CAMについては私たちのノートを参照してください。\n> \n> - **[[15.12] CAM：モデルはどこを見ている？](/blog/papers/classic-cnns/cam)**\n\n\n[![Grad-CAMの可視化結果で、全6列。クラスはそれぞれTailed frog、Toilet tissue、Loudspeaker、Spider web、American egret、Tank。1行目は入力画像で、その下の3行は上から順にResNet50、ResNet50 + SE、ResNet50 + CBAMのヒートマップ。各画像の下には、そのネットワークの正解クラスに対するsoftmaxスコアPが書かれている。CBAMの行は赤い領域がたいてい物体全体を覆い、スコアも最も高い。たとえばTankは0.14763、0.15367から0.53005に上がっている](/content/papers/assets/80d662363e321efb620082338d5820d7ffec1bee0ef0cb792b3b69e58a759f43.png)](/content/papers/assets/80d662363e321efb620082338d5820d7ffec1bee0ef0cb792b3b69e58a759f43.png)\n\n*原論文Fig. 5の上半分の最初の6列。[**v2 PDFの12ページ**](https://arxiv.org/pdf/1807.06521v2#page=12)から抜粋。各画像の下のPは、ネットワークの正解クラスに対するsoftmaxスコアです。*\n\n各列は上から順に、元画像、ResNet-50、SEを加えたもの、CBAMを加えたもののヒートマップです。シラサギ（American egret）を例にとると、元のResNet-50の赤い領域は頭のあたりに集中していますが、CBAMの赤い領域は体全体に沿って伸びていて、正解クラスのスコアも0.64から0.87に上がっています。戦車の列はさらにはっきりしていて、スコアは0.15前後から0.53に跳ね上がります。\n\nここから著者らは、CBAMの改善は注意がより正確になったことによるもので、雑然とした背景の干渉も抑えられていると推測しています。これらは選び出された例で、モジュールが何をしているかを示すことはできますが、それを定量的に確かめるには、やはり前の表に戻る必要があります。\n\n## 結論\n\nCBAMのチャネル注意は、平均プーリングに加えて最大プーリングも見ます。その後に空間注意を加え、どの位置を見るかを決めます。二つのサブモジュールは順に残差分岐につながり、パラメータはSEとほぼ同じです。\n\n分解してみると、ResNet-50でSEより上積みされた0.48ポイントの大部分は最大プーリングから来ていて、もう半分の仕事を受け持つ空間注意の貢献は0.14だけで、存在感はいまひとつです。少しだけ手を加えたいなら、SEの平均プーリングを「平均＋最大」に変えるだけで、恩恵の大部分が得られます。\n\nGrad-CAMの図については、CBAMがどの列でも最も的確に見ていて、スコアも最も高くなっています。著者らが選りすぐって論文に載せた例ですから、見栄えがいいのは当然です。モジュールが役に立つかどうかを判断するなら、やはり前の表に戻ることになります。\n","imageSizes":{"/content/papers/assets/6bb23fb7d2af72e07e37ef41762e65dd79a4f36a6b6309ea002c27127650f5bd.png":{"width":1446,"height":437},"/content/papers/assets/c62baa4fde1b39b59d98582de01b1a1303f006289a91791c235dfc69e88ec40b.png":{"width":1395,"height":713},"/content/papers/assets/80d662363e321efb620082338d5820d7ffec1bee0ef0cb792b3b69e58a759f43.png":{"width":960,"height":713}}}
