3.3. renom.layers package

class Layer ( unit=0 , channel=1 , filter=(3 , 3) , stride=(1 , 1) , padding=(0 , 0) , weight_scale=0.1 , initializer=None , input_size=None , name=None , **kwargs )

ベースクラス: renom.layers.layer.BaseLayer

活性化関数や畳込み層などのすべての層の基底となるクラス。 引数nameに層の名前を与えることで、ネットワークモデル構築後に 名前でアクセスできる。

パラメータ:
  • unit ( int , tuple ) – 出力ユニットサイズ
  • channel ( int ) – 出力チャネルサイズ
  • filter ( tuple ) – フィルタサイズ
  • stride ( tuple ) – ストライド幅
  • padding ( tuple ) – パディング幅
  • weight_scale ( float ) – 初期重みを与えるガウス分布の標準偏差
  • initializer ( Initializer ) – 初期化方法
  • input_size ( int , tuple ) – 入力ユニットサイズ
  • name ( sting ) – 層の名前

Layerオブジェクトは入力ユニットサイズ(input_size)と出力ユニットサイズ(unit or channel)が 指定されていない場合、初期化されない。

>>> import numpy as np
>>> import renom.layers as L
>>> x = np.random.rand(2, 3)
>>> dense_layer = L.Dense(unit = 2, input_size = 3)
>>> dense_layer.forward(x, training = False)
array([[-0.13573003, -0.10797674],
       [-0.06709442, -0.07220624]], dtype=float32)

Modelクラスにレイヤが渡された場合は、Modelクラスが前後のレイヤオブジェクトから それぞれのレイヤへ入力されるユニットサイズを判断するため、input_sizeは指定する必要はない。

name

層の名前を取得

Getter string: 層の名前
>>> import renom.layers as L
>>> dense_layer = L.Dense(unit = 2, input_size = 3, name = "dense")
>>> dense_layer.name
'dense'
unit

出力サイズを取得

Getter int,tuple:
出力サイズ
>>> import renom.layers as L
>>> dense_layer = L.Dense(unit = 2, input_size = 3)
>>> dense_layer.unit
2
forward ( x , y=None , training=True )

各層の順伝播計算を実行する。trainingが真のとき、逆伝播時に勾配を計算するための 値が保存される。

入力xとそれに対する教師データyは第一次元が等しい必要がある。

パラメータ:
  • x ( ndarray ) – 入力データ
  • y ( ndarray ) – 教師データ
  • training ( boolean ) – 学習フラグ
Return ndarray:

層の出力

>>> x = np.random.rand(2, 3)
>>> dense_layer = L.Dense(unit = 2, input_size = 3, name = "dense")
>>> dense_layer.forward(x, training = False)

array([[ 0.14404972, -0.04988028], [ 0.08947193, -0.0510973 ]], dtype=float32)

backward ( dy=None )

逆伝播を実行する関数。

パラメータ: dy ( ndarray ) –
Return ndarray: 層への入力に関する勾配
>>> import numpy as np
>>> import renom.layers as L
>>> x = np.random.rand(2, 3)
>>> y = np.random.rand(2, 2)
>>> dense_layer = L.Dense(unit = 2, input_size = 3, name = "dense")
>>> dense_layer.forward(x, y)
array([[ 0.01707601,  0.04573524],
       [ 0.04901978,  0.14356726]], dtype=float32)
>>> dense_layer.backward(np.ones_like(y))
array([[-0.02820359,  0.20394367,  0.01205625],
       [-0.02820359,  0.20394367,  0.01205625]], dtype=float32)
update ( hook=None )

逆伝播で得られた勾配を元に重みパラメータを更新する。

パラメータ: hook ( function ) – Optimizerで定義された勾配更新関数
truncate ( )

BPTT法による時系列データの学習時、時系列方向の伝播を打ち切る。

predict ( x )

入力xに対する推論を返す。

パラメータ: x ( ndarray ) – 入力データ
parameter

重みパラメータの辞書を返す。

Return dict: 重みパラメタが入った辞書
>>> import renom.layers as L
>>> dense_layer = L.Dense(unit = 2, input_size = 3, name = "dense")
>>> dense_layer.parameter.keys()
['b', 'w']    # weightとbiasパラメータに関するキー
>>> dense_layer.parameter["w"]    # weight を取得
array([[ 0.0434669 , -0.08192204],
       [-0.08437429,  0.10947683],
       [-0.09525634, -0.05201185]], dtype=float32)

新たな重みを代入する場合、以下のようにする。

>>> new_weight = np.random.rand(3, 2)
>>> new_weight
array([[ 0.66475363,  0.59914022],
       [ 0.76608105,  0.17854037],
       [ 0.70510651,  0.89628095]])
>>> dense_layer.parameter["w"] = new_weight
>>> dense_layer.parameter["w"]
array([[ 0.66475363,  0.59914022],
       [ 0.76608105,  0.17854037],
       [ 0.70510651,  0.89628095]])
gradient

逆伝播で得られた勾配を辞書形式で返す。 parameters関数と同様の方法で値の取得、代入ができる。

Return dict: 勾配が入った辞書
info ( )

層のハイパーパラメータ情報を返す。

>>> import renom.layers as L
>>> layer = L.Dense(unit = 2, input_size = 3)
>>> print(layer.info())
Dense
    name:None
    unit:2
    weight_size:(3, 2)
    bias_size:(2,)
Return string: 層の情報