#注意書き
自分用のメモかつ知り合いに説明する際に使う用のTensorFlowまとめ。
間違ってることとかあったらコメントで指摘してもらえると助かります。
#TensorFlowとは
すごい身も蓋もない言い方をすれば「バックエンド(C++)に完全に計算を丸投げできる配列計算ライブラリ」。
やってることはバックエンドで動くNumPy、機械学習に特化したNumPy。
これを分かってればそこそこ気楽な心構えで入門できるはず。
#機械学習ライブラリの魅力
そもそもニューラルネットワークや機械学習する際に機械学習ライブラリ使う理由について挙げてみる。
- 機械学習関連の関数や機能が豊富
- GPUが使える
- 並列学習ができる
- 計算中はPythonレイヤーに戻ってこないので計算が早い
#TensorFlowの魅力
最近だと機械学習ライブラリにはPytorchとかChainerとかいろいろあるけどじゃあ今TensorFlowを使うメリットはなんなのか挙げてみる。
- TPUを現在唯一公式サポートしている
- 利用者数が機械学習ライブラリで最多だから資料が豊富
- 行列を意識するような低レベルAPIでの計算をゴリゴリ書ける
- Define by Runであるため理論上の計算速度はDefine and Runのライブラリより早い
#動作の仕組み
TensorFlowは計算グラフという物を構築して、その計算グラフに従ってバックエンドで計算している。
この計算グラフとは「こういう計算をしてください」という指示を有向グラフで示した物であり、基本的には計算手順を示す道具にすぎない。
例えば、2項の足し算の計算グラフの場合はこのようになる。
それでは実際にプログラムでこの計算グラフの再現を行ってみる。
まずは普通にPythonコードから。
a = input()
b = input()
y = a + b
print(y)
しかし、TensorFlowの場合は以下のように途端に回りくどくなりめんどくさくなる。
import tensorflow as tf
a = tf.placeholder(tf.int32, name="a")
b = tf.placeholder(tf.int32, name="b")
y = tf.add(a,b)
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
print(sess.run(y, feed_dict={a:int(input("input a >>")),b:int(input("input b >>"))}))
「aとbのplaceholderを確保してadd(a,b)でa,bの足し算のノードを定義して、そのノードの出力をyへ入れる。with文でtfのSessionを開始し、global_variables_initializerで計算グラフ内の変数を初期化、sess.runで実際の計算を開始」という回りくどいことをやって初めて計算可能になる。
なんでこんなことをしているのかというと計算グラフ形式だといくつかの性質から偏微分が簡単になりニューラルネットの計算がやりやすくなるだけでなく、そもそもバックエンドに完全に計算を任せるために必要になる。
#終わりに
今回はそもそもTensorFlowって何なのかとざっくりその仕組みについて書いてみた。
次は簡単な使い方について解説してみたい。