Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

MNISTを認識するニューラルネットワークの画像化

More than 3 years have passed since last update.

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

アルゴリズム

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

比較の基準としてピクセルがすべて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の書き方を参考にさせていただきました。

7shi
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away