Edited at

論文メモ: Squeeze-and-Excitation Networks

More than 1 year has passed since last update.


SENetsとは

“SENet"というネットワークがあるわけではなく、”SE”をResNetやInceptionと組み合わせて作り出せるネットワークの総称です。

既存のネットワーク、例えばResNetInceptionに適用して、より性能の高いモデルを実現します。

下記の説明が簡潔ですが、元の論文の説明を交えて解釈したほうが良かったので、この記事にまとめました。


概要

通常CNNの畳み込み層では、入力チャンネルが畳み込まれたあと、全て均等にチャンネルに出力されます。

これに対してSENetsは畳み込み層の各チャンネルを均等に出力せず、適応的に重みをかけることがポイントです。

SE(”Squeeze-and-Excitation"ブロックの実装例を見てみましょう。

def se_block(in_block, ch, ratio=16):

z = GlobalAveragePooling2D()(in_block) # 1
x = Dense(ch//ratio, activation='relu')(z) # 2
x = Dense(ch, activation='sigmoid')(x) # 3
return multiply()([in_block, x]) # 4



  1. Global Average Poolingで、チャンネルごとの代表値として画素値平均zを取る。(ぎゅっとSqueezeする部分)


  2. zは、更にch//ratio個に減らしてチャンネル間の非線形の関係を取る。わざとボトルネックを作って次元削減している。

  3. 再びchに次元を戻す。(チャンネル間の相関を強調する、と書いてあることに相当するのか)。

  4. ここまで計算された値で各チャンネルを重み付ける。(2からここまでがExcitation)

image.png



図: SEブロック (Squeeze-and-Excitation Networks, arXiv:1709.01507 [cs.CV] より)


利点

このSEブロックが、入力が条件付けるダイナミクスを本質的にもたらして特徴を識別する能力を高める、と論文で述べています。

またこのブロックを追加したとしても、計算量は1%以下しか増加せず、様々な既存モデルに適用できることが特徴ということです。例えばResNet-50に適用することで、ResNet-101相当の性能になり、ResNet-101に比べて半分の計算量になることが利点となります。