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は計算の対象外になります。