はじめに
前回、TensorFlowの概要記事を書いた。概要としてはまだ足りないのだが、次に進まないとならない。
TensorFlowのプログラムを組むのに簡単な例として、フィボナッチ数列が良さそうなので、これを題材として理解してみる。
ネットで検索したフィボナッチ数列のPython用プログラムを参考とする。
参照:Python(11)再帰のお勉強:フィボナッチの数列
フィボナッチ数列(Fibonacci number)とは
1+1=2、1+2=3、2+3=5、3+5=8… と、前項2つを加えて、次々とできる数の列のことをフィボナッチ数列といいます。
このフィボナッチ数列の隣接する2つの数の比は限りなく黄金比に近づいています。花びらの数、葉のつき方など自然界にもこの周期が現れるものも多くあります。 また、名刺の縦横比、建物や絵画、彫刻などのバランスの美しさにも、この黄金比が現れていることが多いのです。
blog.livedoor.jp
この漸化式で表せる数列です。
0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765, 10946, …
プログラム 1
import argparse import tensorflow as tf import sys def flowfib(n): # f_n = f_n-1 + f_n-2 f = [tf.constant(0),tf.constant(1)] if n>2: for i in range(2,n): f_i = f[i-1] + f[i-2] f.append(f_i) with tf.Session() as sess: result = sess.run(f) print(result) flowfib(20) #[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181]
説明
[TensorFlow] APIドキュメントを眺める -Tensor編-
整数リテラルを使って生成した Tensor については tf.int32 が要素の数値型として適用される模様です。
import tensorflow as tf a = tf.constant(0) a.dtype # tf.int32
appendは、Pythonの要素追加メソッドです。
f.append(f_i)
プログラム 2
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)) # u = u + v update_v = tf.assign(v, tf.sub(u,v)) # v = 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)
説明
定義の値の更新の代入にはtf.assignを使う。足し算(tf.add)、引き算(tf.sub)を使う。 https://www.tensorflow.org/versions/0.6.0/api_docs/python/state_ops.html#assign
update_u = tf.assign(u, tf.add(u,v)) # u = u + v update_v = tf.assign(v, tf.sub(u,v)) # v = u - v
セッションの最初に変数を初期化する必要がある。これには、init = tf.initialize_all_variablesを使う。sess.run(init)にて初期化を実行する。
init = tf.initialize_all_variables() sess.run(init)
sess.runにより値を取ったり、手続きを実行したりします。
print(i, sess.run(v)) #値の取得 sess.run(update_u) #定義の実行 sess.run(update_v) #定義の実行
最後に
モデルを定義してから実行するというのが、今までの習っていたプログラムと違うので、慣れる必要がありますね。 mirai-tec.hatenablog.com