2016-06-23 13 views
3

Tensorflowグラフを作成する定義済みのコードがあります。変数は変数スコープに含まれ、それぞれには事前定義された初期化子があります。 変数の初期化子を変更する方法はありますか?Tensorflowの変数の初期化子を変更します。

例:

with tf.variable_scope('conv1') 
    tf.get_variable_scope().reuse_variable() 
    w = tf.get_variable('weights',initializer=tf.contrib.layers.xavier_initializer(uniform=False)) 

しかし、私は、変数を再利用する場合、初期化子を: 最初のグラフは

with tf.variable_scope('conv1') 
    w = tf.get_variable('weights') 

後、私は、変数を変更し、ザビエルに初期化を変更したい上の定義変更されません。 後でinitialize_all_variables()デフォルト値を取得しますが、Xavierではありません 変数の初期化を変更するにはどうすればよいですか? ありがとう

+1

あなたは共有/変数を再利用したいので、また、単一の初期化子を持つべきであると初期化子を変更すると、この場合の概念的意味をなすようには見えないだけで、単一の変数は、存在するので、おそらくそれがTensorflowがあなたにそれを変えることを許さない理由です。単にtf.get_variable( 'weights')またはtf.variable_scope( 'conv1')の最初の出現にイニシャライザを追加できますか? –

答えて

1

問題は、再使用の設定(最初のブロックで初期化が設定されている)で初期化を変更できないことです。

最初の可変スコープコール中にxavierの初期化でそれを定義するだけです。だから、最初の呼び出しは、すべての変数の初期化は正しいことで次のようになります。

with tf.variable_scope(name) as scope: 
    kernel = tf.get_variable("W", 
          shape=kernel_shape, initializer=tf.contrib.layers.xavier_initializer_conv2d()) 
    # you could also just define your network layer 'now' using this kernel 
    # .... 
    # Which would need give you a model (rather just weights) 

あなたが重みの再利用設定する必要がある場合は、2番目の呼び出しはあなたにそれのコピーを取得することができます。

with tf.variable_scope(name, reuse=True) as scope: 
    kernel = tf.get_variable("W") 
    # you can now reuse the xavier initialized variable 
    # ....