search
LoginSignup
21
Help us understand the problem. What are the problem?

More than 5 years have passed since last update.

posted at

updated at

Organization

機械学習ライブラリTensorFlowで学習しない〜フィボナッチ数列

機械学習とかよくわからないけど、なんか理解できる範囲で計算してみたいという人向けに、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を触っていない人も何かやってみましょう。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
21
Help us understand the problem. What are the problem?