機械学習とかよくわからないけど、なんか理解できる範囲で計算してみたいという人向けに、TensorFlowでフィボナッチ数列をしてみましょう。
基本
フィボナッチ数列
$$ a_{n+2} = a_{n+1} + a_n, \
a_1 = 1, \
a_0 = 0 $$
を計算するために、例えば、
u = 1
v = 0
for i in range(100):
print i, v
u = u + v
v = u - v
のようにすればできるでしょう。
準備
TensorFlowは
import tensorflow as tf
で読み込むとします。
Variable
まず、uとvという変数をTensorFlowの変数に直しましょう。それには、次のようにVariableを使いましょう。
u = tf.Variable(1, "int64")
v = tf.Variable(0, "int64")
int64にしたのはオーバーフロー対策ですが、残念ながら、第93項でオーバーフローが発生します。これを省略したらint32として扱われます。
表示
print u
で表示すれば良いように思えますが、残念ながら、期待したものが得られないでしょう。TensorFlowでは変数や関数・手続きを定義するフェーズと、実際にデータを処理していくフェーズに分かれています。
実際にデータを処理するにはtf.Sessionを使います。セッションの最初に変数を初期化する必要がある。これには、tf.initialize_all_variablesを使う。そして、次のようにすれば、uやvの値が取れます。
init = tf.initialize_all_variables()
with tf.Session() as sess:
sess.run(init)
print sess.run(v)
sess.runにより値を取ったり、手続きを実行したりします。
更新
残りは値の更新の部分ですね。代入にはtf.assignを使う。足し算引き算には、tf.addとtf.subを使う。そして、代入という手続きを定義しよう。
update_u = tf.assign(u, tf.add(u, v)) # u = u + v
update_v = tf.assign(v, tf.sub(u, v)) # v = u - v
まとめ
以上の話をまとめると、
import tensorflow as tf
u = tf.Variable(tf.cast(1,"int64"))
v = tf.Variable(tf.cast(0,"int64"))
update_u = tf.assign(u, tf.add(u,v))
update_v = tf.assign(v, tf.sub(u,v))
init = tf.initialize_all_variables()
with tf.Session() as sess:
sess.run(init)
for i in range(100):
print i, sess.run(v)
sess.run(update_u)
sess.run(update_v)
実行すると、何やらCPUがどうとかといがIで始まるログが表示されるが、Infoなので気にしなくていいと思う。
まだTensorFlowを触っていない人も何かやってみましょう。