コンピュータビジョンにおける注目の要約

はじめに:
アテンションメカニズム(アテンション)最初のアプリケーションは、マシンの翻訳である必要があります。近年、コンピュータービジョン(CV)タスクで一般的になっています。CVの注意メカニズムの主な目的は、ニューラルネットワークが興味深い場所の学習に集中できるようにすることです。

序文:

注意、2つあります。1つはソフトフォーカス(ソフトアテンション)、もう1つは強いアテンション(ハードアテンション)です。
1.ソフトアテンションはエリアやチャネルにより多くの注意を払い、ソフトアテンションは決定論的アテンションであり、学習が完了した後にネットワークを介して直接生成できます。最も重要な点は、ソフトアテンションが区別可能であるということです。これは非常に重要です。地元。区別できる注意は、ニューラルネットワークを介して計算し、勾配と順方向伝搬および逆方向フィードバックを計算して、注意の重みを学習できます。
2.強い注意は、より多くの注意を意味します。つまり、画像内のすべてのポイントが注意を拡張する可能性があります。同時に、強い注意は、動的な変化を強調するランダムな予測プロセスです。もちろん、最も重要なことは、強い注意は区別できない注意であり、トレーニングプロセスは強化学習(RL)を通じて行われることが多いということです。

空間領域での注意:

対応する空間変換は、画像内の空間ドメイン情報に対して実行されるため、重要な情報を抽出できます。スペースをマスクしてスコアを付け、空間アテンションモジュールを表します。
1.以下はGoogleDeepMindによって提案されたSTNネットワークです。
ここに写真の説明を挿入
ここでのローカリゼーションネットはアフィン変換係数の生成に使用され、入力はC×H×W次元の画像、出力は空間変換係数であり、そのサイズは学習する変換のタイプによって異なります。ただし、アフィン変換の場合は6次元ベクトルです。つまり、目標位置を特定してから、回転などの操作を実行することで、入力サンプルを習得しやすくします。
2. Dynamic Capacity Networksは、2つのサブネットワーク、つまり低パフォーマンスのサブネットワーク(粗いモデル)と高性能のサブネットワーク(細かいモデル)を使用します。
ここに写真の説明を挿入
次の図の操作fcに示すように、低パフォーマンスのサブネットワークを使用して、画像全体を処理し、関心のある領域を特定します。次の図の操作ffに示すように、高性能サブネットワークは対象領域を改良します。この2つを一緒に使用して、計算コストを下げ、精度を高めます。

チャネルドメインの注意-SENet:

チャネルと重要な情報の間の相関関係を表すために各チャネルの信号に重みを追加するのと同様に、重みが大きいほど相関が高くなります。チャネルのマ​​スクを生成してスコアを付けます。代表者はSEnet、チャネルアテンションモジュールです。
1. SEnetは2017年の世界チャンピオンです。SEのフルネームはSqueeze-and-Excitationです。これはモジュールです。既存のネットワークがSEモジュールに組み込まれている場合、ネットワークはSENetであり、ほとんどすべての一般的なネットワークに組み込むことができます。
ここに写真の説明を挿入
上の写真はSEnetのブロックユニットです。写真のFtrは従来の畳み込み構造です。XとUはFtrの入力(C '×H'×W ')と出力(C×H×W)です。これらは過去のものです。構造はすでに存在します。SENetの追加部分は、Uの後の構造です。まず、Uのグローバル平均プーリングを実行し(図ではFsq(。)、作成者はそれをスクイーズプロセスと呼びます)、出力1×1×Cデータは2レベルの完全接続を通過します(図Fex(。)では、著者はExcitationプロセスを呼び出しました)、最後にsigmoid(論文のセルフゲーティングメカニズム)を使用して[0、1]の範囲に制限し、この値をUのCチャネルのスケールとして乗算します。次のレベルの入力データとして。この構造の原理は、スケールのサイズを制御することによって重要な特徴を増やし、重要でない特徴を弱め、それによって抽出された特徴をより方向性のあるものにすることです。
素人の言葉で言えば、複雑な特徴マップを処理することにより、チャネル数に等しい1次元ベクトルが各チャネルの重要度スコアとして取得され、次に各チャネルの重要度スコアに各チャネルが乗算されます。元の値は、私たちが求める実際の機能マップです。この機能マップのチャネルが異なれば、重要性も異なります。
Inception構造とResnet構造を埋め込む例を以下に示します
ここに写真の説明を挿入
。pytorchコードの実装:

class SELayer(nn.Module):
    def __init__(self, channel, reduction=16):
        super(SELayer, self).__init__()
        self.avg_pool = nn.AdaptiveAvgPool2d(1)
        self.fc = nn.Sequential(
            nn.Linear(channel, channel // reduction, bias=False),
            nn.ReLU(inplace=True),
            nn.Linear(channel // reduction, channel, bias=False),
            nn.Sigmoid()
        )
 
    def forward(self, x):
        b, c, _, _ = x.size()
        y = self.avg_pool(x).view(b, c)
        y = self.fc(y).view(b, c, 1, 1)
        return x * y.expand_as(x)

おすすめ

転載: blog.csdn.net/qq_42823043/article/details/107785329