我正在尝试在我的图表中使用占位符作为变量(因此我可以稍后对其进行优化),但我不知道最好的方法。我试过这个:
x = tf.placeholder(tf.float32, shape = [None,1])
x_as_variable = tf.Variable(x, validate_shape = False)
但是每当我构建我的图表时,当我尝试添加我的损失函数时出现错误:
train = tf.train.AdamOptimizer().minimize(MSEloss)
错误是: ValueError:未在未知的TensorShape上定义as_list()。
即使你完全不熟悉这个错误,如果你可以指导我如何构建一个具有占位符值的复制变量,我真的很感激。 谢谢!
答案 0 :(得分:4)
正如您所注意到的,TensorFlow优化器(即tf.train.Optimizer
的子类)对tf.Variable
个对象进行操作,因为它们需要能够为这些对象分配新值,而在TensorFlow中只能为变量赋值支持分配操作。如果您使用tf.placeholder()
,则无需更新,因为占位符的值在每个步骤中都是不可变的。
那么你如何针对输入值进行优化?我可以想到两个选择:
您可以先为变量分配一个输入值,然后根据它进行优化,而不是输入tf.placeholder()
:
var = tf.Variable(...)
set_var_placeholder = tf.placeholder(tf.float32, ...)
set_var_op = var.assign(set_var_placeholder)
# ...
train_op = tf.train.AdamOptimizer(...).minimize(mse_loss, var_list=[var, ...])
# ...
initial_val = ... # A NumPy array.
sess.run(set_var_op, feed_dict={set_var_placeholder: initial_val})
sess.run(train_op)
updated_val = sess.run(var)
您可以使用较低级别的tf.gradients()
函数在一个步骤中获取相对于占位符的损失梯度。然后,您可以在Python中使用该渐变:
var = tf.placeholder(tf.float32, ...)
# ...
mse_loss = ...
var_grad, = tf.gradients(loss, [var])
var_grad_val = sess.run(var_grad, feed_dict={var: ...})
PS。您定义tf.Variable(tf.placeholder(...), ...)
的问题中的代码只是定义一个变量,其初始值由占位符提供。这可能不是您想要的,因为优化程序创建的训练操作将仅使用分配给变量的值,并忽略您向占位符提供的任何内容(在初始化步骤之后)。