sugaton sa damgo

備忘録

theano 入門 まとめ

研究室のGPU使いたい・・・でもC(C++) and Cudaで書くのは辛いなあ・・・ということでpythonのライブラリtheanoを使っていました。

theano公式
Welcome — Theano 0.6 documentation

正直GPU使わないならscipy, numpyあたりでいいと思いました。

ここが日本語では丁寧.


theano実装の流れ

関数を定義
  1. variable(関数の引数になる), shared variable(モデルのパラメータ,学習データ)の定義
  2. サポートされている演算 (theano.dot etc.. , 四則演算など)と変数等使って各式を定義
  3. 目的の値を得る, 学習するなどの関数を定義
学習, テスト

コードで見る流れ

すごく簡単な分類器を作ってみます. 間違っていたらすみません.

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変数に入れてしまったほうが,データ数が大きくなると早いようです。