レイヤーの重み初期化方法

初期化用引数で,Kerasレイヤーの重みをランダムに初期化する確率分布を指定できます.

初期化用引数のキーワードはレイヤーにより異なりますが,大抵は単純にinitです:

model.add(Dense(64, init='uniform'))

利用可能な初期化方法

  • uniform
  • lecun_uniform: input数の平方根でスケーリングした一様分布 (LeCun 98)
  • normal
  • identity: shape[0] == shape[1]の2次元のレイヤーで使えます
  • orthogonal: shape[0] == shape[1]の2次元のレイヤーで使えます
  • zero
  • glorot_normal: fan_in + fan_outでスケーリングした正規分布 (Glorot 2010)
  • glorot_uniform
  • he_normal: fan_inでスケーリングした正規分布 (He et al., 2014)
  • he_uniform

初期化は,文字列(上記の利用可能な初期化方法のいずれかとマッチしなければならない)かcallableとして渡される.callableなら,shape (初期化するvariableのshape) と name (variable名) の2つの引数を取り,variable (つまりK.variable() の出力) を返さなければならない:

from keras import backend as K
import numpy as np

def my_init(shape, name=None):
    value = np.random.random(shape)
    return K.variable(value, name=name)

model.add(Dense(64, init=my_init))

次のようにkeras.initializationsの関数を使うこともできる:

from keras import initializations

def my_init(shape, name=None):
    return initializations.normal(shape, scale=0.01, name=name)

model.add(Dense(64, init=my_init))