広島大学ITエンジニアアドベントカレンダー Advent Calendar 2019の6日目の記事です。
広島大学工学部4年生荒木勇登です!
来年から福岡でITエンジニアします!
いみこというハンドルネームでTwitterをやっていますのでそちらもご確認ください。
(https://twitter.com/es__135 )
#Thano入門
import numpy as np
import theano.tensor as T
from theano import function
x = T.dscalar('x')
y = T.dscalar('y')
z = x + y
f = function([x,y],z)
f(2,3) #array(5.)が出力されます。
(より引用http://deeplearning.net/software/theano/tutorial/adding.html#exercise)
5,6行目で下の関数で使う変数を定義して、7行目、8行目で関数を作ります。
慣れないうちはちょっと違和感がありますが書き慣れると書きやすくなってくる書き方です。
これの応用で三平方の定理を書いてみます。
x = T.dscalar('x')
y = T.dscalar('y')
Pythagoras = ( x**2 + y**2 )**(1/2)
length = function([x,y],Pythagoras)
length(3,4) #5.0が出力されます。
#自動微分
詳しいことはWikipediaを読んで欲しいのですが、定義した関数の微分を計算することができます。
x = T.dscalar('x')
#y = sin(x) + cos(x)
y = T.sin(x) + T.cos(x)
#yをxに関して微分するの意味
gy = T.grad(cost=y, wrt=x)
f = function(inputs=[x], outputs=gy)
# 具体的なxを与えて微分係数を求める
print (f(0)) #1.0
print (f(np.pi / 4))#1.1102230246251565e-16
print (f(np.pi)) #-1.0000000000000002
(この記事を参考にさせていただきました。この記事では他にたくさんの実例が紹介されていますのでオススメです。)
また、
x = T.dscalar('x')
y = T.dscalar('y')
z = T.sin(x) + T.cos(y)
#z = sin(x) + cos(y)
#yをxに関して微分するの意味
dx = T.grad(cost=z, wrt=x)
dy = T.grad(cost=z, wrt=y)
dz_dx = function(inputs=[x,y], outputs=dx)
dz_dy = function(inputs=[x,y], outputs=dy)
# 具体的なxを与えて微分係数を求める
pi = math.pi
dz_dx(pi/2,pi/2) #array(6.123234e-17)
dz_dy(0,pi/2) #array(-1.)
このように2変数の微分の計算も行うことができます。
なんとなく使い方がわかっていただけたでしょうか。
#まとめ
すこし特殊な書き方ですが、慣れると意外と書きやすく使いやすいと思いました。
時間があればThanoを使ってニューラルネットワークを実装する記事も書いてみたいと思います。
これが初期のDeepLearingでに使われていたライブラリでここから現代のライブラリに発展していった道のりは想像もつきません笑。勉強します
#参考文献
theano ドキュメンテーション
http://deeplearning.net/software/theano/tutorial/adding.html#exercise
人工知能に関する断創録
http://aidiary.hatenablog.com/entry/20150518/1431954329