LoginSignup
2
3

More than 5 years have passed since last update.

Chainerの基本オブジェクトについて〜functions編〜

Posted at

前回からChainerの基本オブジェクトについて私が勉強したことを記述しています.
前回はVariableについて書きました.今回は活性化関数や誤差関数などニューラルネットワークにおいて重要な関数を提供するfunctionsについて書きます.

functions

前回紹介したVariableオブジェクトを変数として持つ関数をfunctionsは提供してくれます.
Variableと同じくchainerから呼び出します.(すでにchainerとVariableは呼び出されている前提)

from chainer import Function as F

関数はざっくり言うと色々あります.
例えば三角関数とか...

>>> x = Variable(np.array([-1], dtype=np.float32))
>>> F.sin(x).data
array([-0.84147056], dtype=float32)
>>> F.cos(x).data
array([ 0.54030228], dtype=float32)

ちなみに関数の返り値はVariableオブジェクトとして返されるため,微分も可能です.

>>> x = Variable(np.array([-0.5], dtype=np.float32))
>>> z = F.cos(x)
>>> z.data
array([0.87758255], dtype=float32)
>>> z.backward
>>>x.grad
array([0.47942555], dtype=float32)

ここで,

(\cos x)' = - \sin x

なので,

>>> - F.sin(x).data
array([0.47942555], dtype=float32)

同じ結果となることが確認できました.

なお,変数が多次元となる場合は,関数の傾きをあらかじめ指定する必要があるみたいです.

>>> x = Variable(np.array([-1, 0, 1], dtype=np.float32))
>>> z = F.sin(x)
>>> z.grad = np.ones(3, dtype=float32) #3次元の配列をあらかじめ作成
>>> z.backward()
>>> x.grad
array([0.54030228, 1., 0.54030228], dtype=float32)

なお,np.onesではなくnp.zerosを使うとx.gradの際に全て0になってしまいます.

>>> z.grad = np.zeros(3, dtype=float32) #3次元の配列をあらかじめ作成
>>> z.backward()
>>> x.grad
array([0., 0., 0.], dtype=float32)

ちなみにそれらしいsigmoid関数を使うと(sigmoid関数は(-∞, ∞)→ (0, 1)の単調増加連続関数.活性化関数として用いられる.)

>>> x = Variable(np.array([-1, 0, 1], dtype=np.float32))
>>> x.sigmoid(x).data
array([ 0.37754068], dtype=float32)

あっという間に計算できました.

おわりに

簡単な計算のみになりましたが,今回はここまでにします.
次回はlinksオブジェクトについて書きます.

参考

新納浩幸
Chainerによる実践深層学習~複雑なNNの実装方法~ オーム社

2
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3