2017-07-07 1 views
0

アダム・オプティマイザを2回使用してコード内のテンソルを最小限に抑えようとしていますが、GradientDescentOptimizerを2回使用しようとしましたが問題ありません。 at:tensorflowVariable RNNLM/RNNLM/embedding/Adam_2/ does not existですが、その解決策はここでは機能しません。私はまた、ページを参照してください:https://github.com/tensorflow/tensorflow/issues/6220、しかし、私はまだ理解していません。

私のコードは、私はエラーメッセージが表示されます。ValueError:変数NN/NN/W/Adam_2 /が存在しないか、tf.get_variable()で作成されていません。 VarScopeでreuse = Noneを設定することを意味しましたか?

は、その後、私はtensorflowVariable RNNLM/RNNLM/embedding/Adam_2/ does not existで解決策を試してみましたが、あなたは絶対に すべての変数が時間で定義されていることを確認し、同じスコープでそれをしなければならない場合
アダム・オプティマイザをテンソルで使用する

import tensorflow as tf 

def main(): 
    optimizer = tf.train.GradientDescentOptimizer(0.005) 
    # optimizer = tf.train.AdamOptimizer(0.005) 

    with tf.variable_scope('NN') as scope: 
     W = tf.get_variable(name='W', initializer=tf.random_uniform(dtype=tf.float32, shape=[5, 1])) 
     X = tf.get_variable(name='X', initializer=tf.random_uniform(dtype=tf.float32, shape=[5, 1])) 
     y_ = tf.get_variable(name='y_', initializer=tf.random_uniform(dtype=tf.float32, shape=[5, 1])) 
     y1 = W + X 
     loss_1 = tf.reduce_mean(tf.abs(y_ - y1)) 


     # train_op1 = tf.train.GradientDescentOptimizer(0.005).minimize(loss_1) 
     train_op1 = tf.train.AdamOptimizer(0.005).minimize(loss_1) 
     # with tf.variable_scope('opt'): 
     #  train_op1 = tf.train.AdamOptimizer(0.005).minimize(loss_1) 

     ############################################################################################## 
     scope.reuse_variables() 

     W2 = tf.get_variable(name='W', initializer=tf.random_uniform(dtype=tf.float32, shape=[5, 1])) 
     X2 = tf.get_variable(name='X', initializer=tf.random_uniform(dtype=tf.float32, shape=[5, 1])) 
     b = tf.Variable(tf.random_normal(shape=[5, 1], dtype=tf.float32)) 
     y2 = W2 + X2 + b 
     loss_2 = tf.reduce_mean(tf.abs(y_ - y2)) 

     # train_op2 = tf.train.GradientDescentOptimizer(0.005).minimize(loss_2) 
     train_op2 = tf.train.AdamOptimizer(0.005).minimize(loss_2) 
     # with tf.variable_scope('opt'): 
     #  train_op2 = tf.train.AdamOptimizer(0.005).minimize(loss_2) 


if __name__ == '__main__': 
    main() 
+0

2つ目のオプティマイザを別のスコープに入れてみることはできますか? – rmeertens

+0

2つ目のオプティマイザを別のスコープに配置していただきありがとうございます。しかし、私はまだ私のコードでエラーが発生した理由を知らない – Joey

答えて

0

にこの問題を解決する最も簡単な方法は、異なるスコープで二オプティマイザを入れています。この方法で名前を付けても混乱はありません。

0

を動作しません。 私はなぜこのように動作するのかについてさらに研究する必要がありますが、オプティマイザの設定はグラフの下位レベルでロックされ、動的にはアクセスできなくなります。

最小限の作業例:

import tensorflow as tf 

def main(): 
    optimizer = tf.train.GradientDescentOptimizer(0.005) 
    # optimizer = tf.train.AdamOptimizer(0.005) 

    with tf.variable_scope('NN') as scope: 
     assert scope.reuse == False 
     W2 = tf.get_variable(name='W', initializer=tf.random_uniform(dtype=tf.float32, shape=[5, 1])) 
     X2 = tf.get_variable(name='X', initializer=tf.random_uniform(dtype=tf.float32, shape=[5, 1])) 
     y2_ = tf.get_variable(name='y_', initializer=tf.random_uniform(dtype=tf.float32, shape=[5, 1])) 
     b = tf.get_variable(name='b', initializer=tf.random_normal(shape=[5, 1], dtype=tf.float32)) 
     y2 = W2 + X2 + b 
     loss_2 = tf.reduce_mean(tf.abs(y2_ - y2)) 

     # train_op2 = tf.train.GradientDescentOptimizer(0.005).minimize(loss_2) 
     train_op2 = tf.train.AdamOptimizer(0.005).minimize(loss_2) 


     # with tf.variable_scope('opt'): 
     #  train_op1 = tf.train.AdamOptimizer(0.005).minimize(loss_1) 

    ############################################################################################## 
    with tf.variable_scope('NN', reuse = True) as scope: 


     W = tf.get_variable(name='W', initializer=tf.random_uniform(dtype=tf.float32, shape=[5, 1])) 
     X = tf.get_variable(name='X', initializer=tf.random_uniform(dtype=tf.float32, shape=[5, 1])) 
     y_ = tf.get_variable(name='y_', initializer=tf.random_uniform(dtype=tf.float32, shape=[5, 1])) 
     b = tf.get_variable(name='b', initializer=tf.random_normal(shape=[5, 1], dtype=tf.float32)) 

     y1 = W + X 
     loss_1 = tf.reduce_mean(tf.abs(y_ - y1)) 


     # train_op1 = tf.train.GradientDescentOptimizer(0.005).minimize(loss_1) 
     train_op1 = tf.train.AdamOptimizer(0.005).minimize(loss_1) 
     # with tf.variable_scope('opt'): 
     #  train_op2 = tf.train.AdamOptimizer(0.005).minimize(loss_2) 


if __name__ == '__main__': 
    main()