Variableオブジェクトの使い方について記載します。
使用する場合、Variableをインポートします。from chainer import Variable
Variableオブジェクト作成
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での計算
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 に格納されます。
上記の結果
[81.] None [1.] [18.]
逆伝番での注意
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() を行うと以下の結果になります。
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は計算の対象外になります。