Variableオブジェクトの使い方について記載します。
使用する場合、Variableをインポートします。from chainer import Variable
Variableオブジェクト作成
1 2 3 4 5 6 7 8 9 10 11 12 |
from chainer import Variable from chainer import cuda import numpy as np # numpyのデータを作成 x_data = np.array([10], dtype=np.float32) または #cudaのデータを作成 x_data = cuda.cupy.array([10], dtype=np.float32) # Variableオブジェクトの作成 x = Variable(x_data) |
Variableは、numpyまたは、cudaのデータをパラメータで引き渡して作成します。
Variableでの計算
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
x = Variable(np.array([10], dtype=np.float32)) y = x**2 - 2*x + 1 ① x = Variable(np.array([10], dtype=np.float32)) # 計算結果 print (y.data) # 逆伝播表示 print (y.grad) # 誤差逆伝播法(バックプロパゲーション) y.backward() # 逆伝播表示 print (y.grad, x.grad) |
①のように通常の変数のように計算することができます。(ここでは逆伝番は計算されません)
結果は、 .data に格納されます。
.backward() により逆伝播を処理します。
結果は、 .grad に格納されます。
上記の結果
1 2 3 |
[81.] None [1.] [18.] |
逆伝番での注意
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
a1 = Variable(np.array(10.0)) a2 = Variable(np.array(11.0)) b1 = a1 + a2 b2 = Variable(np.array(12.0)) c1 = b1 * b2 print ('a1={0} a2={1} b1={2} b2={3} c1={4}'.format(a1.data ,a2.data, b1.data, b2.data, c1.data)) print ('a1={0} a2={1} b1={2} b2={3} c1={4}'.format(a1.grad, a2.grad, b1.grad, b2.grad, c1.grad)) c1.backward() print ('a1={0} a2={1} b1={2} b2={3} c1={4}'.format(a1.data ,a2.data, b1.data, b2.data, c1.data)) print ('a1={0} a2={1} b1={2} b2={3} c1={4}'.format(a1.grad, a2.grad, b1.grad, b2.grad, c1.grad)) |
b1とc1の値は、Variableになります。
c1で backward() を行うと以下の結果になります。
1 2 3 4 |
a1=10.0 a2=11.0 b1=21.0 b2=12.0 c1=252.0 a1=None a2=None b1=None b2=None c1=None a1=10.0 a2=11.0 b1=21.0 b2=12.0 c1=252.0 a1=12.0 a2=12.0 b1=None b2=21.0 c1=1.0 |
b1は計算の対象外になります。