ichou1のブログ

主に音声認識、時々、データ分析のことを書く

tensorflowメモ(手書き文字認識その2)

前回生成したモデルを掘り下げてみる。
重み付けを行うパラメータが「final_w」に入っているとする。

final_w.shape
(64, 10)

# 最小値
numpy.min(final_w)
-1.68

# 最大値
numpy.max(final_w)
1.55

「final_w」をグレースケール変換して視覚化してみる。
変換手順は以下のとおり。

  • 各値に、「1.68」を加算する(結果は 0 から 3.36(= 1.68 x 2)の範囲になる)
  • 各値を「75.893」倍(= 255 / 3.36)する(結果は 0 から 255の範囲になる、元々のゼロは「127.5」になる)
  • 各値の端数を切り捨てる

各クラス(0から9)ごとの重みパラメータの変換結果は以下のとおり。

重みパラメータを可視化

f:id:ichou1:20181211112830p:plain

中間値が灰色だとすると、白に近い部分は正、黒に近い部分は負に該当する。

これをゼロとラベル付けした画像に適用してみる。
f:id:ichou1:20181211113542p:plain

outputとして出力された値を足し上げて各クラスの尤度を判定する。
outputの白に近い部分は正の値、黒に近い部分は負の値として作用する。

入力画像をモデルに通した後の各クラスの値
0:  2.6651433
1: -1.6024852
2: -0.6885104
3: -0.2711072 
4: -0.0937684 
5:  0.1937362 
6: -0.3147157 
7: -0.5869334 
8:  0.0727276
9:  0.6259142

クラス"0"の値が一番大きく、次いで、クラス"9"の値が大きくなっている。

クラス"9"の重みを見てみると、左下部分に入力があるとマイナスに作用するようになっている。
クラス"9"のoutputでも左下部分がマイナスとして出力されており、結果、インプット画像がクラス"9"であることの尤度を押し下げている。
(クラス"0"とクラス"9"の特徴分けをしているのは左下部分と言える)