28
26

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

JuliaでTensorFlow その1

Last updated at Posted at 2018-04-08

Julia 0.6.2でTensorFlowを使ってみる。
TensorFlowとは、機械学習のフレームワークの一つで、Pythonでよく使われている。
Juliaで使った文献が英語も含めてほとんどなかったので、少し書いてみる。
ついでに、TensorFlowの考え方について「小人モデル」で解説を試みる。
その1では、単純な計算をやってみる。

Juliaでは、TensorFlow.jlというラッパーを使うことでTensorFlowを使うことができる。
https://github.com/malmaud/TensorFlow.jl

JuliaでTensorFlowを使う利点

向いている人

  1. TensorFlowの独特の文法を使いたくなく、Juliaっぽく普通な感じで書きたい人
  2. 学習に入れるためのインプットのデータを作成する際に、Pythonが遅すぎてPython独自の考え方(全てをnumpyの演算に乗せる)を強いられるのが辛い人

必要のない人

  1. Pythonとnumpyを使った高速化手法が苦にならない人
  2. TensorFlowにすでに慣れてしまった人

JuliaでTensorFlowを使う欠点

  1. 文献が英語も日本語も含めて全然ない

#インストール
Juliaでいつも通りに
Pkg.add("TensorFlow")
で入れれば入るはず。

#TensorFlowの仕組み〜二人の小人モデル
TensorFlowでは、計算を定義してから、実行する。
これは通常のプログラミングとは大分異なっている印象を与えており、戸惑う原因の一つとなっている。
これに慣れるためには、TensorFlowには二人小人がいて、それぞれに作業指示を出している と考えてみよう。
小人でも妖精でも良いが、寝ている間に靴を作ってくれたりする謎の生き物程度に考えてもらえればよい。

  • 小人A(グラフ生成職人)

この小人は、小人Bに指示を出す小人で、小人Bが作業しやすい最高の設計図(グラフ)を書いてくれる。私たちは小人Bが気持ち良く作業できる設計図を書くことができない。小人BはTensorFlow界のグラフ言語しか読めないのである。そこで、私たちはPythonなりCなりJuliaなりでグラフの描き方を小人Aに教える。

  • 小人B(グラフ計算職人)

この小人は、小人Aから受け取ったグラフを使って、高度に最適化された最高の仕事をしてくれる(はず)。小人Bに対しては、私たちは「これが欲しい」としか言えない。計算の仕方とかその他は全部小人Aを通さないと小人Bは理解してくれない。

#TensorFlowでの基本的事項〜小人に仕事をさせる前に
グラフ生成職人である小人Aに何かを伝えるために、TensorFlow界で重要な数の種類について知っておく必要がある。主に3種類ある。

  1. constant
    文字通り、定数である。小人Bがやってくれる最高の仕事(グラフ計算)中に値が変わらないものである
  2. Variable
    変数である。これは、他のプログラム言語で言う「変数」と同じ意味を持ち、小人Bのグラフ計算の間に値が変更されるものである。機械学習で用いる場合には、この値は最適化されたりする。
  3. placeholder
    インプットの引数である。小人Bに指定できるのは「これが欲しい」ということと、「これを使って欲しい」ということだけであり、placeholderは引数になり得るもののことである。機械学習では、ここにインプットするデータを入れることになる。

#TensorFlowでの基本的計算〜小人に仕事をさせてみよう
TensorFlowでは、たとえ簡単な和でも、小人Aを通してから小人Bに仕事をさせなければならない。
https://github.com/malmaud/TensorFlow.jl
にもある簡単な計算を再現してみよう。

test1.jl
using TensorFlow
x = constant(Float64[1,2])
y = Variable(Float64[3,4])
z = placeholder(Float64)
w = exp(x + z + -y)

sess = Session()
run(sess, global_variables_initializer())
res = run(sess, w, Dict(z=>Float64[1,2]))
println(res)
close(sess)

となる。まずはじめに、x,y,zが何であるかを小人Aに指示し、wというOperation(計算)を指示している。
次に、行列演算を含んだものをやってみよう。計算としては
$$
w = x W + b
$$
を考えてみる。ここで、wやxやbは横ベクトルである。まだよくわかっていないが、横ベクトルを使うことがTensorFlowでは多い。これを計算するJuliaコードは

test2.jl

b = Variable(Float64[1 2])
x = placeholder(Float64)
W = Variable(Float64[1 2 
    3 4])
y = x*W + b
sess = Session()
run(sess, global_variables_initializer())
println(run(sess, y, Dict(x=>Float64[1 2])))
close(sess)
b0 = Float64[1 2]
x0 = Float64[1 2]
W0 = Float64[1 2
    3 4]
y0 =x0*W0+b0 
println(y0)

となる。このコードの後半は、普通にJuliaで計算した場合であり、値が同じであることを確かめることができる。
Python版と違って、掛け算が*で定義できていることに注意。Juliaでは行列の演算を*で表現でき、Tensorflowでもそのまま使うことができる。同様に、足し算+も同じである。

三角関数などの計算も同様にできる。Juliaの場合、.をつけることで要素毎に演算することができる。

test3.jl

b = Variable(Float64[1 2])
x = placeholder(Float64)
W = Variable(Float64[1 2 
    3 4])
y = x*W + b
y2 = sin.(y)
sess = Session()
run(sess, global_variables_initializer())
println(run(sess, y2, Dict(x=>Float64[1 2])))
close(sess)
b0 = Float64[1 2]
x0 = Float64[1 2]
W0 = Float64[1 2
    3 4]
y0 =x0*W0+b0 
y20 = sin.(y0)
println(y20)

このように、JuliaでTensorFlowを使うことで、見た目がほとんどJuliaそのままでTensorFlowの計算ができることがわかる。

28
26
0

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
  3. You can use dark theme
What you can do with signing up
28
26

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?