2017-09-15 57 views
1

我试图计算图像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

Xy的值是从feed_dict馈入的值,Z是这些值的函数,所以TensorFlow无法训练它们。

不是将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'的'张量值,并将其输送到'X'和'y'不使用'placeholder'? – tahsin314

+0

对不起。我打算放弃,但错误地推错了按钮,现在它被锁定。 – 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})