Introduction of version 2

ReNom version 2では、version1.0に自動微分機能が追加され、より自由度の高いニューラルネットワークを構築することが可能となりました。

Concept of version 2

2においても過去バージョンと同様に「使いやすさ」を追求しています。

ReNom version 2はNumpyとの相性の良さを特徴としています。

これにより、構築可能なニューラルネットワークの自由度を広げつつ、新たに定義されるユーザインタフェースを減らし、Numpyを使用したことのあるユーザにとって非常に使い易いライブラリになりました。

具体的にNumpyのコードとReNomのコードを比較します。

● Numpy
>>> import numpy as np
>>> a, b = np.arange(2), np.arange(2)
>>> x = np.arange(2)
>>> z = np.sum(a*x + b)
>>> print(z)
2.0
● ReNom
>>> import numpy as np
>>> import renom as rm
>>> a, b = np.arange(2), np.arange(2)
>>> x = rm.Variable(np.arange(2))
>>> z = rm.sum(a*x + b)
>>> print(z)
2.0

>>> dx = z.grad().get(x)
>>> print(dx)
[0, 1]

上記のようにNumpyで書かれたコードを僅かに変更することで、勾配の計算を実行することができます。

自動微分

ReNomでは微分対象となる変数をVariableで定義し、Numpyと同様の書き方で計算式を記述することで計算グラフが作成されます。

>>> import renom as rm
>>> a, b = 2, 3
>>> x = rm.Variable(1)
>>> z = a*x + b
>>> gradient = z.grad().get(x)
>>> print(gradient)
2.0

Variableクラスは Numpyのndarrayクラスを継承しているので、Numpyを使用する感覚で計算グラフを立てることができます。

Sequential Model

1.0までのバージョンと同様に、レイヤを積み重ねるようなインターフェースでモデルを定義することができます。

import renom as rm

model = rm.Sequential([
      rm.Dense(100),
      rm.Relu(),
      rm.Dense(10)
   ])

ReNomに定義されたクラスは、すべて先頭が大文字で始まります。上記のコードの様に、Sequentialモデルはレイヤはオブジェクトのリストを与えることでインスタンス化することができます。

Functional Model

2では、これまでレイヤとしてオブジェクトとして扱っていた活性化関数レイヤや、全結合レイヤを関数的に扱えるようになりました。

import renom as rm

class NN(rm.Model):

   def __init__(self):
      self._layer1 = rm.Dense(100)
      self._layer2 = rm.Dense(10)

   def forward(self, x):
      h = rm.relu(self._layer1(x))
      z = rm._layer2(h)
      return z

model = NN()

ReNomに定義された関数はすべて先頭が小文字で始まります。上記のコードの様に、関数としてレイヤオブジェクトを扱うことができます。

Computation with GPU

GPUを使用するには、Cuda-ToolkitとcuDNNが必要となります。以下の関数を呼ぶことで、GPUのオンオフを切り替えることが可能です。

import renom as rm
rm.set_cuda_active(True)