KDOG Notebook

どうも、古くからの友人です。

CNN-GAP for MNIST

Introduction

従来のCNNでは最後の畳み込み層の出力をベクトル化して全結合層に渡し、続くソフトマックス層で分類を実行している。つまり、畳み込み層で得られた画像の特徴を用いてMLPで分類をしている。Linらの研究では最後の畳み込み層の出力に対してglobal average pooling(GAP)という手法を用いることで従来のベクトル化を回避している。これにより得られたベクトルを直接ソフトマックス層に渡すことで、より畳み込みの利点(物体の位置や方向に関する情報)を生かすことができる。さらに、Zhouらの研究ではGAPを用いて物体の位置を特定させることに成功している。

Class Activation Mapping

$f_k$を最後の畳み込み層の$k$番目のカーネルの画像とするとGAPの結果は

$$\begin{eqnarray} F_k = \frac{1}{XY} \sum_{x,y} f_k(x,y) \end{eqnarray}$$

として得られる。ただし、$x$および$y$はピクセルの座標で、$x=1, \cdots ,X \quad , y=1, \cdots ,Y$である。従って、クラスcにおけるソフトマックス層の入力値は

$$\begin{eqnarray} S_c = \sum_k w_{k}^c F_k \end{eqnarray}$$

である。ただし、$w_{k}^c$ は重みで、クラスcにおける$F_k$の重要度を決める値である。

ここで、$M_c$をクラスcのclass activation mapと定義すると

$$\begin{eqnarray} M_c (x,y) = \sum_k w_{k}^c f_k(x,y) \end{eqnarray}$$

で得られる。

CAM for MNIST

Classification

Tensorflowを利用して計算を実行した。今回用いたモデルおよびコードの一部を以下に載せる。

layers = [                            # (画像サイズ)x(カーネル)
    Conv((3, 3, 1, 8), tf.nn.relu, padding='SAME'),  # 28x28x1 -> 28x28x8
    Conv((3, 3, 8, 8), tf.nn.relu, padding='SAME'),  # 28x28x1 -> 28x28x8
    Pooling((1, 2, 2, 1)),                      # 28x28x8 -> 14x14x8
    Conv((3, 3, 8, 64), tf.nn.relu, padding='SAME'), # 14x14x8 ->  14x14x64
    Conv((3, 3, 64, 64), tf.nn.relu, padding='SAME'), # 14x14x64 ->  14x14x64
    Conv((3, 3, 64, 64), tf.nn.relu, padding='SAME'), # 14x14x64 ->  14x14x64
    GlobalAvgPooling((1, 14, 14, 1)),            #  14x14x64 ->  1x1x64
    Flatten(),
    Dense(64, 10, tf.nn.softmax)
]

x = tf.placeholder(tf.float32, [None, 28, 28, 1])
t = tf.placeholder(tf.float32, [None, 10])

def f_props(layers, x):
    for layer in layers:
        x = layer.f_prop(x)
    return x

y = f_props(layers, x)

cost = -tf.reduce_mean(tf.reduce_sum(t * tf.log(tf.clip_by_value(y, 1e-10, 1.0)), axis=1))
train = tf.train.AdamOptimizer(0.001).minimize(cost)

valid = tf.argmax(y, 1)

30回の学習を行ってF1スコアは0.990となった。

Class Activation Mapping

以下に6つのサンプルについて0~9のクラスにおけるマップ$M_c$を示す。ただし、以下に示したサンプルは正しく分類することができたものである。

いずれのサンプルでも対応するクラスのマップは一部分が活性化(赤色部分)し、それ以外は全体的に不活性(青色部分)になる傾向にあることがわかった。例えば、図の一番上、サンプル8の場合では$c=8$のマップは中央部分が赤く活性化し、周りは青く不活性の状態にある。

f:id:kdog08:20170718113744p:plain:w600

memo

GAPを用いることのもう一つの利点はパラメータ数の削減と過学習の抑制である。従来のベクトル化を実行して全結合層に渡すモデルよりも大幅にパラメータ数を削減することができる。

References

[1] M. Lin, Q. Chen, S. Yan. Network in Network.

[2] B. Zhou, A. Khosla, A. Lapedriza, A. Oliva, and A. Torralba. Learning deep features for discriminative localization.