使用占位符作为tensorflow变量(获取错误!)

时间:2016-11-17 06:06:51

标签: machine-learning tensorflow

我正在尝试在我的图表中使用占位符作为变量(因此我可以稍后对其进行优化),但我不知道最好的方法。我试过这个: 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()。

即使你完全不熟悉这个错误,如果你可以指导我如何构建一个具有占位符值的复制变量,我真的很感激。 谢谢!

1 个答案:

答案 0 :(得分:4)

正如您所注意到的,TensorFlow优化器(即tf.train.Optimizer的子类)对tf.Variable个对象进行操作,因为它们需要能够为这些对象分配新值,而在TensorFlow中只能为变量赋值支持分配操作。如果您使用tf.placeholder(),则无需更新,因为占位符的值在每个步骤中都是不可变的。

那么你如何针对输入值进行优化?我可以想到两个选择:

  1. 您可以先为变量分配一个输入值,然后根据它进行优化,而不是输入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)
    
  2. 您可以使用较低级别的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: ...})
    
  3. PS。您定义tf.Variable(tf.placeholder(...), ...)的问题中的代码只是定义一个变量,其初始值由占位符提供。这可能不是您想要的,因为优化程序创建的训练操作将仅使用分配给变量的值,并忽略您向占位符提供的任何内容(在初始化步骤之后)。