#ChainerのVariable関連
本記事はpython3.xを想定しています。またpython素人なのでご了承ください。機械学習で最初に私がやりたかったのは自分で用意したデータセットに対してなんらかの学習を実行することだったのですが、最初に詰まったのがこのvariableでした。
import numpy as np
import chainer as Variable
chainerを使って定義した機械学習ネットワークにデータを投げる時には型をVariableにしなければいけません。その時、引数に与えるデータは常にnp.arrayを用いる必要があります。このnp.arrayはpythonのnumpyで用いられる配列のことで、python標準のリスト([])とは異なります。Chainerのドキュメントを見ると、variableについて指定できるのは
[data – Data array of type either numpy.ndarray or cupy.ndarray.]
と記述されていますのでリストのデータをそのまま使うのではなく、一度numpyの配列に変換する必要があります。また浮動小数点を用いる場合、float32への変換も必要になることがあります。float32にする理由はchainerがfloat64に対応していないのでエラーが起こるからだったと思います。今回はvariableまでの変換のパターンをいくつか考えてみました。
例1: 配列
x_train = [0,0,0,0,0]
x_np_train = np.array(x_train, dtype=np.float32)
x_val_train = Variable(x_np_train, 1)
とすることによって配列をfloat32を指定しつつnp.arrayに変換し、それをさらにんvariableに変換しています。
例2: 多次元配列
同様の手順でいけます。
x_train = [[0.1, 0,2],[0.3, 0.4]]
x_np_train = np.array(x_train, dtype=np.float32)
x_val_train = Variable(x_np_train, 1)
例3: np.arrayがすでに存在する場合
x_train = [[0.1, 0,2],[0.3, 0.4]]
x_np_train = np.array(x_train)
x_np_train.dtype
とするとdtype('float64')となっています。最初からnp.arrayのデータを扱う場合float32にキャストしなければいけないことが多々あると思います。
x_np_train.dtype = np.float32
x_val_train = Variable(x_np_train, 1)
例4: Variableが他の型ですでに作られている
x_train = [[0.1, 0,2],[0.3, 0.4]]
x_np_train = np.array(x_train, dtype=np.float64)
x_val_train = Variable(x_np_train, 1)
x_val_train.data.dtype
とした場合、dtype('float64')と表示されます。
このままではエラーが出てしまうため
x_val_train.data.dtype = np.float32
x_val_train.data.dtype
とすると、dtype('float32')と表示されます。