ニューラルネットワークによる手書き数字認識について、各ノードへの元画像の影響を視覚化します。

アルゴリズム

【注】適当に思い付いたアルゴリズムです。どの程度正確に影響度が測れるかは未検証です。

比較の基準としてピクセルがすべて0のソースで各ノードの値を計算します。

評価対象とする画像を用意します。1ピクセルだけソースに入れて各ノードの値を計算して、すべて0のときと値を比較します。これをすべてのピクセルに対して行ったものを、ノードごとに特定のピクセルが与える影響とします。

これを画像化することで、視覚的に影響を見ることができます。

準備

『ゼロから作るDeep Learning』のサンプルを使います。

初回実行時にMNIST(手書き数字のデータ)をダウンロードするようになっているので、MNISTを使用するスクリプトを実行しておきます。

$ cd ch03
$ python neuralnet_mnist.py
Accuracy:0.9352

以下の2つのファイルを取り出します。

  • dataset/mnist.pkl
  • ch03/sample_weight.pkl

以下のスクリプトを実行すると、画像が生成されます。

画像例

ニューラルネットワークを計算して、途中のノードを取り出します。sigmoid 適用前後で画像はほとんど変化しないため a1, a2 は捨てます。しかし後で示すように softmax 適用前後では大きく変化するため a3 は拾います。

def predict(x):
    a1 = np.dot(x, W1) + b1
    z1 = sigmoid(a1)
    a2 = np.dot(z1, W2) + b2
    z2 = sigmoid(a2)
    a3 = np.dot(z2, W3) + b3
    z3 = softmax(a3)
    return z1, z2, a3, z3

【追記 2017.08.26】 z1 は影響がピクセルごとに独立しているから良いのですが、z2 以降はピクセル間の影響があり、それを考慮していないことが判明しました。どのように修正するべきか検討中です。進展があれば追記する予定です。

すべて白にした画像を確認します。数値は softmax によって算出された確率を表します。

見出し.png
white.png

背景色(灰色)より明るければプラス、暗ければマイナスとなって、総合的にプラスが大きいものが確率が高くなります。プラスとマイナスは相殺するので、必ずしもはっきり形が分かるものが確率が高くなるとは限りません。softmax を通すとメリハリがなくなって何が何だか分からなくなります。

数字を確認します。すべて白の画像から数字の形にくり抜かれることが分かります。

0.png

1.png

2.png

3.png

4.png

5.png

6.png

7.png

8.png

9.png

参考

Pythonの書き方を参考にさせていただきました。