SSブログ

タブレットでTheano [科学、数学]


森の中でも、Jacobian さんや Hessian さんと親しめるように、AndroidタブレットHUAWEI MediaPad M3のGNURoot Debian環境でTheanoというPythonのライブラリを使えるようにしました。

Theanoは、最近流行りのニューラル・ネットワークを作るときにもつかわれますが、もともとは多次元配列を含んだ数式を効率良く定義、最適化、評価するためのライブラリで、GPUを利用することもできます。








TheanoをARMのCPUで動いているGNURoot Debianで使うためには、環境変数とコンフィグ・ファイルの設定が必要でした。

Theanoは、数式を計算するために、自動でプログラムを作って実行するのですが、ARMの場合、コンパイラのオプションを以下のように環境変数で設定する必要がありました。
THEANO_FLAGS=gcc.cxxflags=-march=armv7
export THEANO_FLAGS

armv7 のところがCPUの型です。
HUAWEI MediaPad M3のCPUは、armv8だと思っていたのですが、Theanoが自動で生成するディレクトリ名が
compiledir_Linux-3.10.94-armv7l-with-debian-8.1--2.7.9-32
となっていたので、素直にarmv7にしました。

あと、GNURoot Debianは、ホームディレクトリにあるファイルは実行権限を付けても実行することができないので、Theanoのコンパイラがファイルを作るディレクトリを /usr/local/bin/Theano のように /usr/local/bin の下に作り、Theano のリソース定義用コンフィグファイル
/home/.theanorc
を作って、このファイルの中に
[global]
base_compiledir = /usr/local/bin/Theano

のように書いて指定します。

z = x * y のような簡単な数式で動作を確認してみます。

import theano
import theano.tensor as T

x = T.scalar('x')
y = T.scalar('y')
z = x * y
f = theano.function([x,y], z)

f(2,3)
#>> array(6.0)


Theanoでは、どのように数式を処理しているか、グラフで出力することもできます。
from theano.printing import pydotprint

pydotprint(f, 'example_1.png')




Jacobian や Hessian もこんな感じで、


# Jacobian times a Vector
#
# R-operator
W = T.dmatrix('W')
V = T.dmatrix('V')
x = T.dvector('x')
y = T.dot(x, W)
JV = T.Rop(y, W, V)
fjr = theano.function([W, V, x], JV)
fjr([[1, 1], [1, 1]], [[2, 2], [2, 2]], [0,1])
#array([ 2., 2.])

pydotprint(fjr, 'example_fjr.png')




# L-operator
W = T.dmatrix('W')
v = T.dvector('v')
x = T.dvector('x')
y = T.dot(x, W)
JV = T.Lop(y, W, v)
fjl = theano.function([W,v,x], JV)
fjl([[1, 1], [1, 1]], [2, 2], [0, 1])
#array([[ 0., 0.],
# [ 2., 2.]])

pydotprint(fjl, 'example_fjr.png')

# Hessian times a Vector
x = T.dvector('x')
v = T.dvector('v')
y = T.sum(x ** 2)
gy = T.grad(y, x)
vH = T.grad(T.sum(gy * v), x)
fh = theano.function([x, v], vH)
fh([4, 4], [2, 2])
#array([ 4., 4.])

pydotprint(fh, 'example_fh.png')

# d3viz module
# Dynamic visualization of Theano graphs.
import theano.d3viz as d3
d3.d3viz(fh, 'fh.html')

d3vizという関数を使うと、インタラクティブに操作可能なHTMLファイルを出力することもできます。





タブレットでTheanoが使えるようになって、どこでも手軽に数式処理ができるようになりましたが、景色の良い所では、プログラミングではなく景色を楽しんだ方が良いようです。













nice!(16)  コメント(0)  トラックバック(0) 

nice! 16

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 0