87

Caffe ネットワークを TensorFlow に移植していますが、初期化がうまくいかないようです。使用してtruncated_normalいますが、これによりトレーニングが非常に難しくなっているようです。

4

10 に答える 10

120

バージョン 0.8 以降、Xavier イニシャライザがあります。ドキュメントについては、こちらを参照してください

次のようなものを使用できます。

W = tf.get_variable("W", shape=[784, 256],
           initializer=tf.contrib.layers.xavier_initializer())
于 2016-04-22T04:23:57.423 に答える
12

@ Aleph7、Xavier / Glorotの初期化は、着信接続の数(fan_in)、発信接続の数(fan_out)、およびニューロンの活性化関数の種類(シグモイドまたはtanh)に依存します。これを参照してください:http://jmlr.org/proceedings/papers/v9/glorot10a/glorot10a.pdf

それでは、あなたの質問に。これは、TensorFlow で行う方法です。

(fan_in, fan_out) = ...
    low = -4*np.sqrt(6.0/(fan_in + fan_out)) # use 4 for sigmoid, 1 for tanh activation 
    high = 4*np.sqrt(6.0/(fan_in + fan_out))
    return tf.Variable(tf.random_uniform(shape, minval=low, maxval=high, dtype=tf.float32))

他の回答で示唆されているように、正規分布ではなく、一様分布からサンプリングする必要があることに注意してください。

ちなみに、私は昨日、Xavier の初期化も使用する TensorFlow を使用した別の記事を書きました。興味がある場合は、エンドツーエンドの例を含む Python ノートブックもあります: https://github.com/delip/blog-stuff/blob/master/tensorflow_ufp.ipynb

于 2015-11-14T17:37:42.593 に答える
8

tensorflow呼び出された素敵なラッパーは、ソースコードで実装を提供します(ここprettytensorから直接コピーされます):

def xavier_init(n_inputs, n_outputs, uniform=True):
  """Set the parameter initialization using the method described.
  This method is designed to keep the scale of the gradients roughly the same
  in all layers.
  Xavier Glorot and Yoshua Bengio (2010):
           Understanding the difficulty of training deep feedforward neural
           networks. International conference on artificial intelligence and
           statistics.
  Args:
    n_inputs: The number of input nodes into each output.
    n_outputs: The number of output nodes for each input.
    uniform: If true use a uniform distribution, otherwise use a normal.
  Returns:
    An initializer.
  """
  if uniform:
    # 6 was used in the paper.
    init_range = math.sqrt(6.0 / (n_inputs + n_outputs))
    return tf.random_uniform_initializer(-init_range, init_range)
  else:
    # 3 gives us approximately the same limits as above since this repicks
    # values greater than 2 standard deviations from the mean.
    stddev = math.sqrt(3.0 / (n_inputs + n_outputs))
    return tf.truncated_normal_initializer(stddev=stddev)
于 2015-12-19T22:25:34.570 に答える
4

私が見たところ、組み込まれているものは何も見つかりませんでした。しかし、これによると:

http://andyljones.tumblr.com/post/110998971763/an-explanation-of-xavier-initialization

Xavier の初期化は、分散がニューロン数の関数である (通常はガウス) 分布をサンプリングするだけです。 tf.random_normalstddev (つまり、初期化しようとしている重み行列によって表されるニューロンの数) を計算するだけで済みます。

于 2015-11-12T19:23:24.540 に答える