2017-09-15 4 views
1

2つの画像の間にl2_lossを計算しようとしていますが、gradientを取得しています。ValueError:最適化する変数がありません

with tf.name_scope("train"): 

    X = tf.placeholder(tf.float32, [1, None, None, None], name='X') 
    y = tf.placeholder(tf.float32, [1, None, None, None], name='y') 
    Z = tf.nn.l2_loss(X - y, name="loss") 
    step_loss = tf.reduce_mean(Z) 
    optimizer = tf.train.AdamOptimizer() 
    training_op = optimizer.minimize(step_loss) 

init = tf.global_variables_initializer() 

with tf.Session() as sess: 
    init.run() 
    content = tf.gfile.FastGFile('cat.0.jpg', 'rb').read() 
    noise = tf.gfile.FastGFile('color_img.jpg', 'rb').read() 
    loss_append = [] 
    for epoch in range(10): 
     for layer in layers: 
      c = sess.run(layer, feed_dict={input_img: content}) 
      n = sess.run(layer, feed_dict={input_img: noise}) 
      sess.run(training_op, feed_dict={X: c, y: n}) 

をしかし、それは次のエラーを与える:私のコードのスニペットは、ここで与えられている

Traceback (most recent call last): 
    File "/home/noise_image.py",  line 68, in <module> 
    training_op = optimizer.minimize(lossss) 
    File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/training /optimizer.py", line 315, in minimize 
    grad_loss=grad_loss) 
    File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/training /optimizer.py", line 380, in compute_gradients 
    raise ValueError("No variables to optimize.") 
ValueError: No variables to optimize. 

それを取り除くためにどのように?

答えて

1

Xyfeed_dictから送られた値を持っている、とTensorFlowはそれらを訓練することはできませんのでZは、これらの関数です。

Xをプレースホルダに設定する代わりに、テンソル値(layer)に割り当てます。 yについても同じ操作を行います。

for epoch in range(10): 
    sess.run(training_op, feed_dict={input_image_content: content, input_image_noise: noise}) 
+0

'layer'は、ここでモデルファイルから特定のレイヤーを復元することによって得られる出力です。このような変数を定義する必要があります(この問題のコードの非関連部分は無視してください)。 'layer'のテンソル値を評価し、' placeholder'を使わずに 'X'と' y'に与える方法はありますか? – tahsin314

+0

downvote申し訳ありません。私はupvoteを与えることを意図したが間違って間違ったボタンを押して、今ロックされています。 – tahsin314

+0

コードの一部を複製する必要があります – user3080953

0

あなたがいない変数ノードで構成されて構築したグラフ:

あなたの最終的なコードは次のようになります。また、変数を使用せずに損失関数を最小化しようとしています。我々は通常、非凸関数を扱うよう

最小化は、少なくとも局所的最小値(関数に代入したときに可能な最小値を与える数学関数(費用関数)の変数の値のセットを見つけることをいいます)。

したがって、コードを実行すると、コンパイラはコスト関数に変数がないことを訴えています。 説明のとおり、placeholderは、実行時にグラフのさまざまな入力に値を供給するために使用されるオブジェクトを指します。

問題を解決するには、作成しようとしているグラフについてもう一度考えなければなりません。

with tf.name_scope("train"): 
    X = tf.placeholder(tf.float32, [1, 224, 224, 3], name='X') 
    y = tf.placeholder(tf.float32, [1, 224, 224, 3], name='y') 

    X_var = tf.get_variable('X_var', dtype = tf.float32, initializer = tf.random_normal((1, 224, 224, 3))) 
    y_var = tf.get_variable('y_var', dtype = tf.float32, initializer = tf.random_normal((1, 224, 224, 3))) 
    Z = tf.nn.l2_loss((X_var - X) ** 2 + (y_var - y) ** 2, name="loss") 

    step_loss = tf.reduce_mean(Z) 
    optimizer = tf.train.AdamOptimizer() 
    training_op = optimizer.minimize(step_loss) 

... 
with tf.Session() as sess: 
    .... 
    sess.run(training_op, feed_dict={X: c, y: n}) 
関連する問題