ダーヤス.com プレミアム

ダーヤス.comにようこそ。プレミアムな情報で、ワークライフバランスの充実を図りませんか。

TensorFlow Tutorial for Expertsの学習結果を視覚化で確認する

   

今更感がありながらも以前、TensorFlow MNIST For ML Beginnersの認識結果を可視化で確認するということを書いたので、今回は今更ながらTensorFlow Tutorial for Expertsの方を実行して、その途中経過での各手書き数字の予測結果を可視化して確認してみたいと思います。

なお、今回のバージョンでは、畳み込みやプーリング、全結合やドロップアウトといった複雑な処理をしていたので、多くのブログや解説記事を拝読させていただきました。

その際、公式のTensorFlow Tutorial for Expertsのチュートリアルでは、コードが分断的に現れては解説文がある、といった書き方だったので、一挙にコードが掲載されていたGitHub GistのTensorFlow Deep MNIST for Experts チュートリアルのコードに記載のUrano氏のコードを利用させていただきました。
ありがとうございます。

実行結果が得られるまでに超時間がかかる

まあ感想としては超時間がかかったということです。
それはもう、開始したことを後悔するくらいに。
途中で買い物に行って30分くらい経って帰宅してみてさあ終わってるかなと思ったらまだ計算していました。
MacBook Airが唸りを上げていて、発熱もしていましたし、壊れるんじゃないかと不安になりました。

それはさておき、とりあえず結果は以下のようになりました。

上記Urano氏のコードには、ご親切に、実行開始から終了までにかかった時間が表示されるコードが記述されていたので、かかった時間がわかりました。

最初、何でこんなコードを埋め込んでいるのかなあと疑問に思ったのですが、なるほど、これほど時間がかかるから、なのですね。

開始時刻: 1477632420.4
--- MNISTデータの読み込み開始 ---
Extracting MNIST_data/train-images-idx3-ubyte.gz
Extracting MNIST_data/train-labels-idx1-ubyte.gz
Extracting MNIST_data/t10k-images-idx3-ubyte.gz
Extracting MNIST_data/t10k-labels-idx1-ubyte.gz
--- MNISTデータの読み込み完了 ---
--- 多層畳み込みネットワークによる訓練開始 ---
step 0, training accuracy 0.1
step 100, training accuracy 0.8
step 200, training accuracy 0.96
step 300, training accuracy 0.88
step 400, training accuracy 0.96
step 500, training accuracy 0.94
step 600, training accuracy 1
step 700, training accuracy 0.94
step 800, training accuracy 0.92
step 900, training accuracy 1
step 1000, training accuracy 0.96
step 1100, training accuracy 0.96
step 1200, training accuracy 0.98
step 1300, training accuracy 0.92
step 1400, training accuracy 0.98
step 1500, training accuracy 0.92
step 1600, training accuracy 0.98
step 1700, training accuracy 0.98
step 1800, training accuracy 0.96
step 1900, training accuracy 1
step 2000, training accuracy 0.98
step 2100, training accuracy 0.98
step 2200, training accuracy 0.96
step 2300, training accuracy 0.98
・・・
中略
・・・
step 18800, training accuracy 1
step 18900, training accuracy 1
step 19000, training accuracy 1
step 19100, training accuracy 1
step 19200, training accuracy 1
step 19300, training accuracy 0.98
step 19400, training accuracy 1
step 19500, training accuracy 0.98
step 19600, training accuracy 1
step 19700, training accuracy 1
step 19800, training accuracy 1
step 19900, training accuracy 1
--- 多層畳み込みネットワークによる訓練終了 ---
test accuracy 0.9931
終了時刻: 1477638526.96
かかった時間: 6106.5640738

かかった時間は約6106秒、すなわち101分ほどかかっているわけです。
途中、省電力モードになってログオフされていたりしたので、その間に計算されていなかったとすると、もう少し短くなったのかもしれませんが、まあ1時間くらいかかっています。

とはいえ、最初の400、500ステップ程度でほぼ確からしさが最終結果の99.2%(今回は99.31%まで行きましたが)程度にまでサチっている感があるので、チュートリアルに用いた訓練データにおいては、20000ステップもやる必要はないのかもしれません。

というわけで、上記を10ステップだけ繰り返した場合と、100ステップと、500ステップでは各々どの程度の制度で予測できているのかを見ていきたいと思います。

y_convの中身を確認する

とりあえず上記コードにおける

print "--- 多層畳み込みネットワークによる訓練開始 ---"
for i in range(20000):

の数値を10でやって見て、その後の訓練で最終的に得られる畳み込み結果の値y_convがどうなっているかを見ます。

とはいえ全部確認してみるのは面倒なので最初の20個だけで。
コードは以下。

for i in range(20):
    print(str(i+1)+"番目:"+str(sess.run(tf.argmax(y_conv, 1), feed_dict={x: [mnist.test.images[i]], keep_prob: 1.0})))

ここで前回との違いは、mnist.test.imagesのデータを入力させる際に、keep_prob: 1.0も一緒に与えてやること。

そうしないと以下のようなエラーが出て実行不可能になります。

Traceback (most recent call last):
File "Documents/mnist_tutorial_experts.py", line 148, in
print(str(i+1)+"番目:"+str(sess.run(tf.argmax(y_conv, 1), feed_dict={x: [mnist.test.images[i]]})))
・・・
tensorflow.python.framework.errors.InvalidArgumentError: You must feed a value for placeholder tensor 'Placeholder_2' with dtype float
[[Node: Placeholder_2 = Placeholder[dtype=DT_FLOAT, shape=[], _device="/job:localhost/replica:0/task:0/cpu:0"]()]]
Caused by op u'Placeholder_2', defined at:
File "Documents/mnist_tutorial_experts.py", line 95, in
keep_prob = tf.placeholder("float")
・・・

さて、10ステップだけの繰り返しで得られた結果は以下。

--- 多層畳み込みネットワークによる訓練開始 ---
step 0, training accuracy 0.14
--- 多層畳み込みネットワークによる訓練終了 ---
test accuracy 0.2911
終了時刻: 1477712449.22
かかった時間: 35.0066847801
1番目:[8]
2番目:[2]
3番目:[1]
4番目:[0]
5番目:[8]
6番目:[1]
7番目:[8]
8番目:[6]
9番目:[3]
10番目:[8]
11番目:[8]
12番目:[8]
13番目:[5]
14番目:[0]
15番目:[1]
16番目:[8]
17番目:[1]
18番目:[3]
19番目:[8]
20番目:[5]

matplotlibでテストデータの中身を可視化

これに対して、実際のテストデータの最初の20個は以下の画像になっています。

matplotlibでテストデータの中身を可視化

しょっぱなから7を「8」と誤答しているし、もう全体的にめちゃくちゃです。

これが100ステップの訓練だと以下のy_convになります。

1番目:[3]
2番目:[6]
3番目:[6]
4番目:[0]
5番目:[8]
6番目:[6]
7番目:[8]
8番目:[8]
9番目:[5]
10番目:[2]
11番目:[0]
12番目:[0]
13番目:[8]
14番目:[0]
15番目:[3]
16番目:[3]
17番目:[8]
18番目:[7]
19番目:[6]
20番目:[8]

なんか、よくなってるんだかどうなのかわからない程度の制度です。

これが500回の繰り返しになると、以下。

かかった時間: 179.966813087
1番目:[7]
2番目:[2]
3番目:[1]
4番目:[0]
5番目:[4]
6番目:[1]
7番目:[4]
8番目:[9]
9番目:[5]
10番目:[9]
11番目:[0]
12番目:[6]
13番目:[9]
14番目:[0]
15番目:[1]
16番目:[5]
17番目:[9]
18番目:[7]
19番目:[3]
20番目:[4]

全正解です。

しかも、「for beginners」のチュートリアルでは誤答していた9番目の「5」についても、今回の手法ではちゃんと正答しています。

MNISTに関しては、今回のディープラーニング手法によって500回の訓練でほぼ十分に学習が終了するんだと思いました。

 - テクノロジー