1.1 変数

Ivoryライブラリでは、入出力のデータやレイヤの重みパラメータなどの実データを変数Variableクラスで扱います。

例を見てみます。

from ivory.core.variable import Variable

v = Variable((3, 4))
v

[1] 2019-06-12 20:00:06 (189ms) python3 (189ms)

<Variable((3, 4)) at 0x2e303d19a90>

第1引数には形状を指定します。ここで形状にはミニバッチ学習におけるバッチサイズを含めません。バッチサイズはあくまでも訓練にかかわるもので、変数自体がその情報を持つ必要はないという考えに基づいています。

Variableインスタンスの持つ属性を確認します。

vars(v)

[2] 2019-06-12 20:00:06 (31.3ms) python3 (220ms)

{'shape': (3, 4),
 'name': '',
 'parameters': [],
 'data': None,
 'grad': None,
 'init': None,
 'frozen': False}

parameters属性は後述するParameterインスタンスの参照です。変数は、複数のParameterで共有されることがあるので、リストになっています。いちばん身近な例は、2つのレイヤを接続するときです。このとき最初のレイヤの出力と次のレイヤの入力は同じ変数を共有します。現在は変数vは孤立した状態なので、値が空リストとなっています。data属性とgrad属性はデータと勾配を保持するNumPyもしくはCuPyのndarrayです。現在は値が割り当てられていません。init属性は変数の値を初期化する際に呼ばれる関数です。

値を入力するには、直接data属性、grad属性にアクセスします。

import numpy as np

v.data = np.random.randn(*v.shape)
v.grad = np.zeros(v.shape)
print("v.data = \n", v.data)
print("v.grad = \n", v.grad)

[3] 2019-06-12 20:00:06 (15.5ms) python3 (236ms)

v.data = 
 [[ 2.09817606  1.45991609 -0.78137285 -1.86309352]
 [ 0.99895115  0.23667057 -0.54619187 -0.83624487]
 [ 0.42656468 -0.02755649 -0.21674828  0.38701634]]
v.grad = 
 [[0. 0. 0. 0.]
 [0. 0. 0. 0.]
 [0. 0. 0. 0.]]