Tensorflowで算数


DeepLearningを始めようとGoogleで「DeepLearning 入門」と検索すると、当たり前のようにMNIST識別の問題が出てきます。C++のHello, WorldやOpenCVのLenna画像表示のように、MNIST識別がDeepLearningの入門だというのです。

僕には無理です。

だって、OpenCVのときはもっと丁寧にみんな教えてくれたじゃないですか。
隣接画素との差分で輪郭を抽出したり、8近傍の平均とってのっぺりさせたり、自分が画素を操作して画像を加工しているんだという感覚を覚えさせてくれたじゃないですか。きっとDeepLearning入門にも、その感覚を求めているんだと思います。

そのために何が必要か考えた結果、ツールを使った算数だと思いました。個人的な当面の目標であるGANを理解するのにTensorFlowを使うつもりでいますが、僕はまだTensorFlowで足し算をすることもできません。
どんな難しいことも基本が大事だって、足し算ができない人に掛け算はできないって、先生が言ってました。

環境構築・起動

今回は算数するだけなのでGPUは不要です。
anacondaはインストールされているものとします。

conda create -n tf python=3.6 tensorflow jupyterlab
source activate tf
jupyter-lab

TensorFlowで算数の手順

問題設定

AくんとBちゃんはおやつを買いました。
おやつの値段は、バナナが1、ドーナツがと2、アップルパイが3コインです。
Aくんはバナナとドーナツ、Bちゃんはドーナツとアップルパイを買いました。
さて、AくんとBちゃんが買ったおやつを全部合わせると、何コインでしょう?

計算の図を書く

問題文から計算の図(グラフ)を書きます。今回はとても簡単でアホらしいですが、こういう図をイメージすることが、論文を読んで実装するときとかに、きっと大事になるんじゃないかなって、勝手に思ってます。

登場人物を揃える

さて、いよいよPythonコードを書きます。
まずはじめに計算に必要なもの、物語でいう登場人物やアイテムを全て宣言します。
今回の問題の登場人物は以下の5つですね

  • バナナ
  • ドーナツ
  • アップルパイ
  • Aくん
  • Bちゃん

では、さっそく宣言します。

変数宣言
banana = tf.Variable(1, name="banana")
donut = tf.Variable(2, name="donut")
applepie = tf.Variable(3, name="applepie")
A = tf.Variable(0, name="A")
B = tf.Variable(0, name="B")

登場人物同士の繋がり方を記述する

次に、用意した登場人物やアイテムの繋がり方を記述します。実際の計算add_op_hogeを記述し、その結果を変数に代入する操作result_hogeが必要な場合はそれも別に記述する必要があります。
今回は全て足し算で繋がっており、その結果もAくん、Bちゃんそれぞれ代入します。今回の問題はAくんとBちゃんの総額なので、最後の足し算も忘れずに記述します。

繋がり方記述
# banana + donut -> A
add_op_A = tf.add(banana, donut)
result_A = tf.assign(A, add_op_A)
# donut + applepie -> B
add_op_B = tf.add(donut, applepie)
result_B = tf.assign(B, add_op_B)
# A + B
add_op_ans = tf.add(A, B)

実行

ここまでで登場人物・アイテムの列挙とそれぞれの繋がり方の記述が完了したので、あとは順番に計算させるだけです。
変数は最初に初期化する必要があるそうです。これ忘れちゃいそうですね。

実行
with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    ans_A = sess.run(result_xy)
    ans_B = sess.run(result_yz)
    ans = sess.run(add_op_xyyz)

結果を確認しましょう。

結果
print("Aくん : " + str(ans_A))
print("Bちゃん : " + str(ans_B))
print("総額 : " + str(ans))

Aくん : 3
Bちゃん : 5
総額 : 8

解けました。

感想

とても簡単な算数の問題をTensorFlowで解きました。簡単すぎて無意味に見えるでしょうが、僕にとってはワケもわからずMNIST識別をするよりもしっかりと歩んでいけてる感じがして満足しています。

これから足し算の部分がもっと複雑な計算になって高度な問題を解いていくことが楽しみだなという感じで、やっとDeepLearningの最初の門の前に立ってワクワクすることができています。

参考文献

TensorFlowの基礎