theano 入門 まとめ
研究室のGPU使いたい・・・でもC(C++) and Cudaで書くのは辛いなあ・・・ということでpythonのライブラリtheanoを使っていました。
theano公式
Welcome — Theano 0.6 documentation
正直GPU使わないならscipy, numpyあたりでいいと思いました。
ここが日本語では丁寧.
theano実装の流れ
関数を定義
- variable(関数の引数になる), shared variable(モデルのパラメータ,学習データ)の定義
- サポートされている演算 (theano.dot etc.. , 四則演算など)と変数等使って各式を定義
- 目的の値を得る, 学習するなどの関数を定義
学習, テスト
コードで見る流れ
すごく簡単な分類器を作ってみます. 間違っていたらすみません.
import theano import theano.tensor as T import numpy
定義の例
1. 変数定義
x = T.vector() # 入力 y = T.scalar() # 答え osize, isize = (2, 10) # 入力が10次元の2値分類器 W = theano.shared(numpy.random.uniform(-0.1, 0.1, (osize, isize))) b = theano.shared(numpy.zeros(osize))
2. 式定義
o = T.nnet.softmax(theano.dot(W, x) + b) cost = -T.log(o[y]) # 負の対数尤度 reg = 0.1 * (T.sum(W**2) + T.sum(b**2)) # 正則化項 cost += reg
3. 関数定義
shared変数の更新はtheano.functionの引数updatesにOrdereddict(key:shared変数, value:更新後の値)を与えることで行います
# x, y が与えられた時の W, bの勾配 gradients = theano.grad(cost, [W,b]) # [(key, value), ...]の形式でも可 update = [(p, p - 0.1 * g) for p, g in zip([W,b], gradients)] # 関数定義 learn = theano.function([x, y], updates=update) predict = theano.function([x], [T.argmax(o)])
学習などの例
# データの中身は割愛 for input_, answer_ in data: learn(input_, answer_)
定義を書いて...という流れが癖がありますが、慣れれば学習周りはスッキリ書けるのは良いです。
少し動作確認したい、みたいなのはめんどくさいですし、ただdeep learning使いたいとかならCaffeとか使ったほうが楽なのかもしれません。
上の例だと毎回学習データを与えていますが, やはりデータを全部shared変数に入れてしまったほうが,データ数が大きくなると早いようです。