ValueError: No variables to optimize
ValueError: No variables to optimize
我正在尝试计算两个图像之间的 l2_loss
并为它们获取 gradient
。这里给出了我的代码片段:
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.
如何摆脱它?
X
和 y
的值来自 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})
您构建的图不含变量节点。您还试图在没有任何变量的情况下最小化损失函数。
最小化指的是为数学函数(成本函数)的变量找到一组值,当在函数中代入时给出最小可能值(至少局部最小值因为我们通常处理非凸函数)。
因此,当您 运行 代码时,编译器会抱怨您的成本函数中没有变量。
澄清一下,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})
我正在尝试计算两个图像之间的 l2_loss
并为它们获取 gradient
。这里给出了我的代码片段:
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.
如何摆脱它?
X
和 y
的值来自 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})
您构建的图不含变量节点。您还试图在没有任何变量的情况下最小化损失函数。
最小化指的是为数学函数(成本函数)的变量找到一组值,当在函数中代入时给出最小可能值(至少局部最小值因为我们通常处理非凸函数)。
因此,当您 运行 代码时,编译器会抱怨您的成本函数中没有变量。
澄清一下,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})