PythonでChainer-Variableオブジェクトを扱いたい
Chainerとは、Preferred Networksが開発したニューラルネットワークを実装するためのライブラリです。Chainerを用いることで比較的容易にニューラルネットワークを実装することができます。ChainerはVariable、functionsなど複数のオブジェクトから構成されており、代表的なオブジェクトは以下の通りとなっています。
1 Variable
2 functions
3 links
4 Chain
5 optimazers
Variableはニューロンの値の配列を複数格納でき、ニューラルネットワークにおけるノードに対応するオブジェクトに使用されます。
Variableのイメージを掴むために、ここではVariableオブジェクトを用いて中学/高校初等レベルの簡単な計算をしてみます。
[mathjax] Variableオブジェクトを使用した簡単な計算①
Variableオブジェクトを使用して次のような計算をしていきます。
①xに値を設定する
\[
x=10
\]
②2次元方程式を計算する
\[
f(x)=2x^2+4x+1\\
\,\,=241
\]
③微分を計算する
\[
f'(x)=4x+4\\
\,\,=44
\]
ソースコード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
import chainer import numpy as np from chainer import Variable # Variableオブジェクトの作成 x = Variable(np.array([10], dtype=np.float32)) print(x.data) y = 2*x**2 + 4*x + 1 print(y.data) # 微分値を求める # y→xと遡って微分値を求める y.backward() print(x.grad) |
ソースコードの詳細
1 2 3 |
import chainer import numpy as np from chainer import Variable |
1 2 |
x = Variable(np.array([10], dtype=np.float32)) print(x.data) |
1 |
[ 10.] |
1 2 |
y = 2*x**2 + 4*x + 1 print(y.data) |
1 |
[ 241.] |
1 2 3 4 |
# 微分値を求める # y→xと遡って微分値を求める y.backward() print(x.grad) |
1 |
[ 44.] |
Variableオブジェクトを使用した簡単な計算 ②
複数まとめて計算することも可能です。前回はx=10としていましたが、x=1~10を同時に計算します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
import chainer import numpy as np from chainer import Variable # Variableオブジェクトの作成 x = Variable(np.array([[1, 2, 3,4,5], [6, 7, 8,9,10]], dtype=np.float32)) print(x.data) y = 2*x**2 + 4*x + 1 print(y.data) # 微分値を求める # y→xと遡って微分値を求める # 要素が複数の場合はy.gradに初期値が必要 y.grad = np.ones((2, 5), dtype=np.float32) y.backward() print(x.grad) |
1 2 3 4 5 6 |
[[ 1. 2. 3. 4. 5.] [ 6. 7. 8. 9. 10.]] [[ 7. 17. 31. 49. 71.] [ 97. 127. 161. 199. 241.]] [[ 8. 12. 16. 20. 24.] [ 28. 32. 36. 40. 44.]] |
上から値の設定、2次元方程式の計算結果、微分の計算結果となっています。
例えば10を設定した場合、10 241 44 となっており初めに計算した結果と同じになっています。