Theano
Pythonの数値計算ライブラリ。
自動微分を行ってくれるので深層学習でよく使われる。
今更ながら勉強してます。
scanについて
Theanoにおける繰り返し処理に対応する関数。
RNNなどの時系列処理における中心的役割を担う関数。
使い方は下記が分かりやすかった。
Python Theano function / scan の挙動まとめ
フィボナッチ数列
フィボナッチ数とは第 n 項の値が第 n - 1 項と第 n - 2 項の和となる数のこと
これを並べた
0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765, 10946, …
みたいな数列をフィボナッチ数列と言う。
詳しくはWiki参照
やってみた
こんな感じでできた。
import numpy as np
import theano
from theano import tensor as T
def fib(seq1, seq2):
return seq2, seq1 + seq2
x = T.iscalar('x')
y = T.iscalar('y')
n = T.iscalar('n')
result, _ = theano.scan(fn=fib,
outputs_info=[x, y],
sequences=None,
non_sequences=None,
n_steps=n)
f = theano.function(inputs=[x, y, n], outputs=result)
print f(0, 1, 20)[0]
[ 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610
987 1597 2584 4181 6765]
最初に[0, 1]を与えてあげる。20は計算回数。
n項目の計算は、(n-1)+(n-2)なので、3項目の計算は、1項目と2項目の和となる。
また、n+1項目の計算は、(n)+(n-1)なので、n-1項目の値は、n,n+1での計算に使われる。
なので、fib関数でn項目の計算時、seq1 + seq2[(n-1)+(n-2)]だけでなく、seq2[(n-1)]の値も返している。
(n+1項目の計算でn-2項目の値は不要なので、seq1は返す必要がない。)
もっと良い書き方もある気がするけど、とりあえずできた。
scanの挙動を勉強するには良い練習だった。