3.4. renom.model package

class Model ( layers=None , models=None , name=None )

ベースクラス: object

Modelクラスは、Layerクラスを取りまとめ、ニューラルネットワークを 構築する。

パラメータ: layers ( list ) – Layerクラスのリスト

Modelクラスは以下のように使用できる。この例では、二層のニューラルネットワークを構築している。

>>> model = Model(
...     layers = [
...         Input(unit = 100),     # 入力層
...         Dnese(unit = 10),      # 中間層
...         Sigmiod(),             # 中間層の活性化関数
...         Dense(unit = 10),      # 出力層
...         Mean_squared_errror(), # 出力層の誤差関数
...     ])

また、モデル内に定義されたLayerオブジェクトを操作したい場合は、次のように インデックス、もしくはレイヤ名で操作するレイヤを取得できる。

>>> from renom.model import Model
>>> import renom.layers as L
>>> model = Model(
...     layers = [
...         L.Input(unit = 10),
...         L.Dense(unit = 100),
...         L.Relu(name = "activation_function"),    # Reluレイヤに名前をつける
...         L.Dense(unit = 10),
...         L.Mean_squared_error()
... ])
>>> model[0]                        # インデックスでレイヤにアクセス
<renom.layers.function.input.Input object at 0x7fe2edf57050>
>>> model[1]
<renom.layers.function.dense.Dense object at 0x7fe2ac4dba10>
>>> model["activation_function"]    # 名前でレイヤにアクセス
<renom.layers.activation.relu.Relu object at 0x7fe2b4747f50>
forward ( x , y=None , training=True )

モデルで定義されたニューラルネットワークの順伝播計算を実行し、 目的関数の評価結果を出力する。

パラメータ:
  • x ( ndarray ) – 入力データ
  • y ( ndarray ) – 教師データ
  • training ( boolean ) – 推論を行う際はFalseとする。

引数x, yはそれぞれ入力データとそれに対する教師データを取る。 forward関数の実行後に逆伝播による学習を行う場合、trainingをTrueにしておく。 trainingがFalseの場合も順伝播計算が実行され、誤差関数の結果が出力されるが、 逆伝播時に使用するデータを保持しない。

>>> import numpy as np
>>> from renom.model import Model
>>> import renom.layers as L
>>> model = Model(
...      layers = [
...          L.Input(unit = 2),
...          L.Dense(unit = 10),
...          L.Relu(),
...          L.Dense(unit = 1),
...          L.Mean_squared_error()
... ])
>>> x = np.array([[1, 2], [3, 4]]) # サイズ 2×2 の入力データ
>>> y = np.array([[1], [0]])       # サイズ 2×1 教師データ
>>> x
array([[1, 2],
       [3, 4]])
>>> y
array([[1],
       [0]])
>>>
>>> model.forward(x, y)
array(0.25382357835769653, dtype=float32)
backward ( dy=None )

ニューラルネットワーク全体を通して逆伝播計算を行う。 逆伝播計算を実行するためにはforward関数を実行しておく必要がある。

パラメータ: dy ( ndarray ) – 後ろの層から逆伝播された勾配
>>> import numpy as np
>>> from renom.model import Model
>>> import renom.layers as L
>>> model = Model(
...      layers = [
...          L.Input(unit = 2),
...          L.Dense(unit = 10),
...          L.Relu(),
...          L.Dense(unit = 1),
...          L.Mean_squared_error()
... ])
>>> x = np.array([[1, 2], [3, 4]])
>>> y = np.array([[1], [0]])
>>> model.forward(x, y)
array(0.27467599511146545, dtype=float32)
>>> model.backward()
array([[ 0.01833857,  0.01328252],
       [ 0.00182291,  0.00132032]], dtype=float32)
single_backward ( dy=None )

ニューラルネットワーク全体を通して逆伝播計算を行う。 backward関数では時系列データを学習する場合、入力されたすべての 時系列データについて逆伝播を実行するが、single_backwardは 呼び出されるたび、1ステップごとに逆伝播計算を実行する。

パラメータ: dy ( ndarray ) – 後ろの層から逆伝播された勾配
update ( optalg=None )

逆伝播計算により得られた勾配を用いて、各層のパラメータを 更新する。

パラメータ: optalg ( function ) – Optimizerから与えられる勾配降下アルゴリズム
predict ( x , layer_name=None )

推論を行う。forward関数と異なり、誤差関数が無視される。

パラメータ:
  • x ( ndarray ) – 入力データ
  • layer_name ( string ) – 層の名前

layer_nameを指定することで、特定の層まで伝播した計算結果を 取得することができる。

>>> import numpy as np
>>> from renom.model import Model
>>> import renom.layers as L
>>> model = Model(
...      layers = [
...          L.Input(unit = 2),
...          L.Dense(unit = 10),
...          L.Relu(name = "activation_function"),
...          L.Dense(unit = 1),
...          L.Mean_squared_error()
... ])
>>> x = np.array([[1, 2], [3, 4]])
>>> model.predict(x) # 出力層の出力
array([[-0.02476717],
       [-0.05358341]], dtype=float32)
>>> model.predict(x, layer_name = "activation_function")  # Reluレイヤの出力
array([[ 0.        ,  0.        ,  0.06811042,  0.33371097,  0.25717309,
         0.0635614 ,  0.        ,  0.        ,  0.17241834,  0.04844952],
       [ 0.        ,  0.        ,  0.29333544,  0.86118776,  0.56491309,
         0.20306033,  0.        ,  0.        ,  0.44523719,  0.01589361]],
         dtype=float32)
truncate ( )

時間方向への誤差の伝播を打ち切る。LstmやRnnなどのアルゴリズムを 使用する場合は、時系列データを区切る際に呼び出す必要がある。

>>> import numpy as np
>>> from renom.model import Model
>>> import renom.layers as L
>>> model = Model(
...      layers = [
...          L.Input(unit = 2),
...          L.Dense(unit = 10),
...          L.Relu(),
...          L.Dense(unit = 1),
...          L.Mean_squared_error()
... ])
>>> N, M, T = (2, 2, 3)
>>> x = np.random.rand(N, M, T)
>>> y = np.random.rand(N, 1, T)
>>> for t in range(T):    # 時系列長Tのデータを学習
...     model.forward(x[:, :, t], y[:, :, t])
...
>>> model.backward()
>>> model.update()
>>> model.truncate()
reset_optimization_params ( )

勾配降下法による学習時に使用する、パラメータをリセットする。

get_parameters ( param_list=None )

モデル内に定義されたレイヤの持つ重みパラメータをリストで 取得する。

パラメータ: param_list ( list ) –
Return list: 重みパラメータのリスト
>>> import numpy as np
>>> from renom.model import Model
>>> import renom.layers as L
>>> model = Model(
...      layers = [
...          L.Input(unit = 2),
...          L.Dense(unit = 3),
... ])
>>> model.get_parameters()
[{}, {'b': array([ 0.,  0.,  0.], dtype=float32),
      'w': array([[-0.01290518, -0.00728257,  0.00370339],
       [-0.02980315, -0.14714776,  0.11620791]], dtype=float32)}]
set_parameters ( parameters )

get_parameters関数で得られたパラメータリストを 受け取り、モデル内のレイヤに反映させる。 同じネットワークモデル同士でのみ、重みの受け渡しが可能。

パラメータ: parameters ( list ) – 重みパラメータのリスト
>>> import numpy as np
>>> from renom.model import Model
>>> import renom.layers as L
>>> model1 = Model(
...      layers = [
...          L.Input(unit = 2),
...          L.Dense(unit = 3),
... ])
>>> model2 = Model(
...      layers = [
...          L.Input(unit = 2),
...          L.Dense(unit = 3),
... ])
>>> m1_param = model1.get_parameters()
>>> m1_param[1]
{'b': array([ 0.,  0.,  0.], dtype=float32), 'w': array([[-0.07156794, -0.13783383,  0.07373838],
       [-0.0020222 ,  0.05040351, -0.0212083 ]], dtype=float32)}
>>> model2.set_parameters(m1_param)
>>> m2_param = model2.get_parameters()
>>> m2_param[1]
{'b': array([ 0.,  0.,  0.], dtype=float32), 'w': array([[-0.07156794, -0.13783383,  0.07373838],
       [-0.0020222 ,  0.05040351, -0.0212083 ]], dtype=float32)}
>>>
get_network_information ( info_list=None )

モデル内のレイヤが持つinfo関数から、層のハイパーパラメータ 情報を文字列のリストとして取得する。

パラメータ: info_list
戻り値: list: 層の情報が入った配列
>>> import numpy as np
>>> from renom.model import Model
>>> import renom.layers as L
>>> model1 = Model(
...      layers = [
...          L.Input(unit = 2),
...          L.Dense(unit = 3),
...          L.Tanh(),
...          L.Dense(unit = 3),
...          L.Soft_max_cross_entropy()
... ])
>>> print("".join(model1.get_network_information()))
Input
    name:None
    unit:2
Dense
    name:None
    unit:3
    weight_size:(2, 3)
    bias_size:(3,)
Tanh
    unit:3
Dense
    name:None
    unit:3
    weight_size:(3, 3)
    bias_size:(3,)
Soft_max_cross_entropy
    name:None
    unit:3
get_gradiennts ( grad_list=None )

逆伝播計算で得られた各層の重みに関する勾配を get_parametersと同様の形式のlistで取得する。

パラメータ: grad_list
set_gradiennts ( gradients )

set_parametersと同様の形式で、各層の重みに関する パラメータをセットする。

パラメータ: gradients ( list ) –
class Model ( layers=None , input_unit=None , name=None )

ベースクラス: object

Modelクラスは、Layerクラスを取りまとめ、ニューラルネットワークを 構築する。

パラメータ: layers ( list ) – Layerクラスのリスト

Modelクラスは以下のように使用できる。この例では、二層のニューラルネットワークを構築している。

>>> model = Model(
...     layers = [
...         Input(unit = 100),     # 入力層
...         Dnese(unit = 10),      # 中間層
...         Sigmiod(),             # 中間層の活性化関数
...         Dense(unit = 10),      # 出力層
...         Mean_squared_errror(), # 出力層の誤差関数
...     ])

また、モデル内に定義されたLayerオブジェクトを操作したい場合は、次のように インデックス、もしくはレイヤ名で操作するレイヤを取得できる。

>>> from renom.model import Model
>>> import renom.layers as L
>>> model = Model(
...     layers = [
...         L.Input(unit = 10),
...         L.Dense(unit = 100),
...         L.Relu(name = "activation_function"),    # Reluレイヤに名前をつける
...         L.Dense(unit = 10),
...         L.MeanSquaredError()
... ])
>>> model[0]                        # インデックスでレイヤにアクセス
<renom.layers.function.input.Input object at 0x7fe2edf57050>
>>> model[1]                        
<renom.layers.function.dense.Dense object at 0x7fe2ac4dba10>
>>> model["activation_function"]    # 名前でレイヤにアクセス
<renom.layers.activation.relu.Relu object at 0x7fe2b4747f50>
class Split ( layers=None , mode='sum' , input_unit=None , name=None )

ベースクラス: renom.model.model.Model

並列に保持する。