ECA-Net:深い畳み込みニューラルネットワークのための効率的なチャネルアテンション

概要

近年、チャネルアテンションメカニズムが深い畳み込みニューラルネットワーク(CNN)のパフォーマンスを向上させる大きな可能性を秘めていることがいくつかの研究で証明されています。既存のメソッドのほとんどは、より複雑なアテンションモジュールの開発に専念しており、パフォーマンスは向上しますが、これにより必然的にモデルの複雑さが増すと考えられます。したがって、複雑さとパフォーマンスの矛盾を克服するために、本稿では効果的なチャネルアテンションモジュールECAモジュールを提案します。少数のパラメータしか含まれていませんが、大幅なパフォーマンスの向上が得られます。分析により、チャネルの注意を学習するために次元削減を回避することが重要であることがわかりました。適切なクロスチャネル相互作用は、パフォーマンスを維持しながらモデルの複雑さを大幅に減らすことができます。したがって、この非次元削減ローカルクロスチャネル相互作用戦略が提案され、これは1次元畳み込みを通じて実現できます。効果的な実装。さらに、1次元たたみ込みカーネルのサイズを適応的に選択する方法が、ローカルクロスチャネル相互作用のカバレッジを決定するために提案されています。

前書き

ディープコンボリューショナルニューラルネットワーク(CNN)はコンピュータービジョンの分野で広く使用されており、画像分類、ターゲット検出、セマンティックセグメンテーションなどの幅広いタスクで大きな進歩を遂げています。先駆的なAlexNetから始まって、深い畳み込みニューラルネットワークのパフォーマンスをさらに向上させるために、近年、畳み込みブロックへのチャネルの注目の導入が広く注目を集めており、パフォーマンス向上の大きな可能性を示しています。これらの方法の1つはSENetです。これは、各畳み込みブロックのチャネルの注意を学習し、さまざまなディープCNNアーキテクチャに大幅なパフォーマンスの向上をもたらします。次の図は、さまざまなアテンションモジュールの比較を示しています。
ここに画像の説明を挿入
SENetでは、より複雑なチャネルの依存関係をキャプチャしたり、追加の空間的注意を組み合わせたりすることで、SEブロックを改善した研究があります。これらの方法は実装されていますが、精度が高いほど、モデルが複雑になり、計算負荷が大きくなるという問題があります。モデルの複雑度を高めてパフォーマンスを向上させる前述の方法とは異なり、この記事では、効果的なチャネルの注意をより効果的な方法で学習できるかどうかに焦点を当てています。

まず、SENetのチャネルのモジュールに注意してください。具体的には、入力特性が与えられると、SEブロックは最初に各チャネルのグローバル平均プールを個別に使用し、次に2つの完全に接続された(FC)層を非線形性で使用し、次にシグモイド関数を使用してチャネルの重みを生成します値。2つのFCレイヤーは、モデルの複雑さを制御するための次元削減など、非線形のクロスチャネル相互作用をキャプチャするように設計されています。この戦略は後続のチャネルアテンションモジュールで広く使用されていますが、次元削減はチャネルアテンション予測に副作用があることを研究は示しており、チャネル間のすべての依存関係をキャプチャすることは非効率的で不必要です。
ここに画像の説明を挿入
したがって、このペーパーでは、次元の削減を回避し、クロスチャネルの相互作用を効果的にキャプチャする、ディープcnnの効率的なチャネルアテンション(ECA)モジュールを提案します。上の図に示すように、ECAは、次元を削減せずにチャネルのグローバル平均プール後に各チャネルとその隣接チャネルを考慮することにより、ローカルチャネル間の相互作用をキャプチャします。実験は、この方法が効率と効果を保証することを証明しています。ECAは、サイズkの高速1Dコンボリューションによって効果的に実装できることに注意してください。カーネルサイズkは、ローカルクロスチャネル相互作用のカバレッジ、つまり、チャネルの注意予測に参加するネイバーの数を表します。相互検証によるkの手動調整を回避するために、kを適応的に決定する方法が開発されました。相互作用のカバレッジはチャネルの次元に比例します。比較すると、いくつかの追加パラメーターとごくわずかな計算が導入され、大幅なパフォーマンスの向上ももたらされます。たとえば、24.37Mパラメータと3.86 GFLOPのResNet-50の場合、ECA-Net50の追加のパラメータと計算はそれぞれ80と4.7e4 GFLOPですが、ECA-Net50は最大精度の点でResNet-50より2.28高くなっています。 %。

次の表は、既存のアテンションモジュールにチャネル次元の削減がない(DRがない)か、チャネル間相互作用がないか、およびパラメーターがSE(軽量で表現)より小さいかどうかを比較しています。ECAモジュールは、非常に軽量な方法でクロスチャネル相互作用を取得しながら、チャネルの次元の減少を回避することにより、チャネルの注意を効果的に学習することが表からわかります。
ここに画像の説明を挿入
寄与は次のように要約されます。
(1)SEブロックが分析され、次元削減と適切なクロスチャネル相互作用の回避が、効果的なチャネル注意と効率的なチャネル注意を学習するために重要であることが証明されます。
(2)高効率チャネルアテンション(ECA)は、ディープcnnネットワーク用の非常に軽量なチャネルアテンションモジュールを開発するために提案され、モデルの複雑さを増加させるだけでなく、大幅な改善ももたらします。
(3)ImageNet-1KとMS COCOの実験結果は、この方法が非常に競争力のあるパフォーマンスを達成しながら、最先端のモデルよりもモデルの複雑さが低いことを示しています。

提案された方法

この記事では、最初にSENetのチャネルアテンションモジュールSEブロックを確認し、次に次元削減効果とクロスチャネル相互作用を分析することによってSEブロックを証明します。これにより、ECAモジュールが提案されました。さらに、ECAパラメータを適応的に決定する方法が開発され、deep cnnに適用する方法の例が示されています。

SEブロックでのチャネルアテンションの再検討

たたみ込みブロックの出力がX∈RW ×H×CR ^ {W×H×C}であるとしますRW × H × C、ここで、W、H、およびCは、それぞれ幅、高さ、およびチャネルサイズ(つまり、フィルターの数)です。これに基づいて、SEブロックの各チャネルの重みは
ここに画像の説明を挿入
ここに画像の説明を挿入
次のように計算できます。モデルが複雑になりすぎないようにするために、w1とw2のサイズをそれぞれC×(C / r)と(C / r)×Cに設定します。f W 1、W 2を見ることができますf_ {W1、W2}fW 1 W 2チャネルアテンションブロックのすべてのパラメータが関係しています。式(2)の次元削減はモデルの複雑さを減らすことができますが、チャネルとその重みの間の直接の対応を破壊します。たとえば、単一のFCレイヤーは、すべてのチャネルの線形結合を使用して、各チャネルの重みを予測します。式(2)では、チャネルフィーチャが最初に低次元空間に投影され、次にマッピングされます。そのため、チャネルとその重みの間の対応は間接的です。

Efficient Channel Attention(ECA)モジュール

上述のように、式(2)の次元削減は、チャネルとその重みの間の対応を間接的にします。その効果を検証するために、著者は元のSEブロックを3つのバリアント(SE-V ar1、SE-V ar2、SEV ar3)と比較します。以下の表から、パラメーターなしのSE-V ar1は元のネットワークよりも優れていることがわかります。これは、チャネルがディープCNNのパフォーマンスを向上させる能力を持っていることを示しています。同時に、SE-var2は各チャネルの重みを個別に学習します。これは、パラメーターが少ない場合のSEブロックよりもわずかに優れています。これは、チャネルとその重みが直接対応する必要があることを意味する可能性があり、次元の減少を回避することは、非線形チャネル相関を考慮するよりも重要です。さらに、SEブロックで単一のFCレイヤーを使用したSEV ar3のパフォーマンスは、次元を削減した2レイヤーのFCレイヤーを使用するよりも優れています。上記の結果は、次元数の削減を回避することで、効果的なチャネルの注意を学ぶのに役立つことを明確に示しています。したがって、チャネルの寸法を削減しないECAモジュールが設計されています。
ここに画像の説明を挿入
次元削減なしの集合体が与えられた場合y∈RC y∈R ^ CそしてRC
ここに画像の説明を挿入
は、WがC×Cパラメータマトリックスである場合に渡す方法を学ぶことができます。特に、se-var2およびse-var3の場合
ここに画像の説明を挿入
、SE-Var2のW var 2 W_ {var2}WそしてR 2これは、Cパラメーターを含む対角行列です。SE -VのW var 3 W_ {var3}WA 3C×Cパラメータを含む完全な行列です。式(4)に示すように、主な違いは、SE-Var3ではクロスチャネル相互作用が考慮されるのに対し、SEV ar2では考慮されないため、SE-Var3の方がパフォーマンスが優れています。この結果は、クロスチャネルインタラクションがチャネル中心の学習に役立つことを示しています。ただし、SEVar3は多数のパラメーターを必要とするため、特に多数のチャネルの場合、モデルが非常に複雑になります。したがって、SE-Var2とSE-Var3の間の可能な妥協点は、W var 2 W_ {var2}を変更することです。WそしてR 2これは、ブロック対角行列に拡張されます。つまり
ここに画像の説明を挿入
、チャネルはGグループに分割され、各グループにはC / Gチャネルが含まれ、各グループのチャネルアテンションは独立して学習され、クロスチャネルの相互作用は部分的にキャプチャされます。したがって、C 2 / GC ^ 2 / Gが含まれていますC2 /Gパラメータ。畳み込みの観点から見ると、SE-Var2、SEVar3、および式(5)はそれぞれ、深度分離型畳み込み、FCレイヤー畳み込み、およびグループ畳み込みと見なすことができます。ここで、グループ畳み込みのSEブロックは次のように表されます。ここに画像の説明を挿入
ただし、グループ畳み込みが多すぎると、メモリアクセスコストが増加し、計算効率が低下します。さらに、表2に示すように、さまざまなグループのSE-GCはSE-Var2と比較してゲインがなく、ローカルのクロスチャネル相互作用をキャプチャするための効果的なソリューションではないことを示しています。その理由は、SE-GCが異なるグループ間の依存関係を完全に放棄したためと考えられます。
この記事では、ローカルのクロスチャネル相互作用を取得して効率と効果を確実にする別の方法を探りました。具体的には、バンド行列W k W_kが使用されます。WKチャンネルの注目度とW k W_kを学習するにはWKあります
ここに画像の説明を挿入
W k W_kWKk * Cパラメータを含めると、式5のパラメータよりも小さくなり、異なるグループ間の完全な独立も回避されます。表2と比較すると、この方法(ECA-NS)は式5のSE-GCよりも優れています。この式のyi y_iの場合そして重みの計算では、k近傍の役割のみが考慮されます
ここに画像の説明を挿入
ΩikΩ_i^ kΩK表示yi y_iそしてk個の隣接チャネルのコレクション、より効果的な方法は、すべてのチャネルに同じ学習パラメーターを共有させることです。つまり、
ここに画像の説明を挿入
この戦略は、カーネルサイズkの高速1次元畳み込みによって実装できます。つまり
ここに画像の説明を挿入
、ここで、C1D 1次元の畳み込みを表します。ここでの方法は、有効チャネルアテンション(ECA)モジュールと呼ばれ、k個のパラメーターのみを含みます。表2に示すように、k = 3のECAモジュールは、SE-var3と同様の結果を得ると同時に、モデルの複雑さを低減します。ローカルのクロスチャネル相互作用を適切にキャプチャすることにより、効率と効果を保証します。

ECAモジュールの目的は、ローカルのクロスチャネル相互作用を適切にキャプチャすることなので、異なるCNNアーキテクチャーの異なるチャネル番号を持つ畳み込みブロックの場合、相互作用の最適なカバレッジを手動で調整できます。ただし、相互検証による手動チューニングは、多くのコンピューティングリソースを消費します。グループのたたみ込みは、CNNアーキテクチャを改善するために正常に完了しました。この場合、高次元(低次元)チャネルには、固定数のグループによる長い(短い)たたみ込みが含まれます。同様の重みを共有すると、これは妥当なカバレッジ相互作用です。つまり、カーネルサイズk(1D畳み込み)はチャネルの次元Cに比例します。つまり、kとCの間にマッピング関係がある可能性があります。
ここに画像の説明を挿入
最も単純なマッピングは線形関数です。ただし、線形関数によって表される関係は限定的すぎます。一方、チャネルの次元Cは通常2の累乗に設定されることはよく知られています。したがって、線形関数を非線形関数に拡張するための可能な解決策が導入されます。
ここに画像の説明を挿入
次に、チャネル次元Cが与えられると、カーネルサイズkを適応的に決定できます
ここに画像の説明を挿入
。| t |は、tの最も近い奇数を表します。この論文のすべての実験では、λとbはそれぞれ2と1に設定されています。明らかに、勾配をマッピングすることにより、高次元チャネルは相互作用が長くなり、低次元チャネルは非線形マッピングによる相互作用が短くなります。
次の図は、pytorchのコードを示しています。
ここに画像の説明を挿入

ECAモジュールを作業に追加する方法

通常、ECAアテンションモジュールは、バックボーンの各レイヤーの間に追加されます。次のコード1 Resnet50は、ECAアテンションモジュールを追加する例として使用されます。initおよびforwardに直接挿入するだけで済みます。

def __init__(self, class_num=1000, backbone=resnet50, pretrained=True,param_path='resnet50-19c8e357.pth'):
        self.backbone = backbone(pretrained=pretrained, param_path=param_path, remove=True, last_stride=1)
        self.eca_layer=eca_layer(2048)
    def forward(self, x):
        x = self.backbone.conv1(x)
        x = self.backbone.bn1(x)
        x = self.backbone.relu(x)
        x = self.backbone.maxpool(x)

        x = self.backbone.layer1(x)
        x = self.backbone.layer2(x)
        x = self.backbone.layer3(x)
        x = self.backbone.layer4(x)
        x = self.eca_layer(x)
        return x

おすすめ

転載: blog.csdn.net/qq_34124009/article/details/107666915