※現在、ブログ記事を移行中のため一部表示が崩れる場合がございます。
順次修正対応にあたっておりますので何卒ご了承いただけますよう、お願い致します。
# おまじない
import numpy as np
import chainer
from chainer import cuda, Function, gradient_check, Variable
from chainer import optimizers, serializers, utils
from chainer import Link, Chain, ChainList
import chainer.functions as F
import chainer.links as L
微分するためには、まず変数を作らないといけない。>>> x = Variable( 5.0 ) Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/home/fuji/anaconda3/lib/python3.5/site-packages/chainer/variable.py", line 95, in __init__ raise TypeError(msg) TypeError: numpy.ndarray or cuda.ndarray are expected. Actual: <class 'float'> >>>エラーメッセージから、Variableに直接5.0を与えてはだめで、型がnumpy.ndarrayかcuda.ndarrayになっていないとダメらしい。
>>> x = Variable(np.array([5.0])) >>> y = x**2 - 2 * x + 1 >>> y.data array([ 16.]) >>> y.backward() >>> x.grad array([ 8.])x=5のときのy=f(x)の値は、
>>> dy = 2 * x - 2 >>> dy.data array([ 8.])
>>> type(x.data[0]) &lr;class 'numpy.float64'> >>> type(y.data[0]) <class 'numpy.float64'&l\gt; >>> type(x.grad[0]) <class 'numpy.float64'>という風に、全部float64になってしまった。
>>> x = Variable(np.array([5.0],dtype=np.float16)) >>> y = x**2 - 2 * x + 1 >>> y.backward() >>> x.grad[0] 8.0 >>> type(x.grad[0]) <class 'numpy.float16'>