gpt4 book ai didi

machine-learning - 使用占位符作为 tensorflow 变量(出现错误!)

转载 作者:行者123 更新时间:2023-11-30 08:52:20 29 4
gpt4 key购买 nike

我试图在图表中使用占位符作为变量(这样我以后就可以对其进行优化),但我不知道最好的方法。我试过这个:
x = tf.placeholder(tf.float32, 形状 = [无,1])
x_as_variable = tf.Variable(x, validate_shape = False)

但是每次我构建图表时,当我尝试添加损失函数时都会收到错误:train = tf.train.AdamOptimizer().minimize(MSEloss)

错误是:ValueError:as_list() 未在未知 TensorShape 上定义。

即使您完全不熟悉该错误,如果您能指导我如何构建一个采用占位符值的复制变量,我将非常感激。谢谢!

最佳答案

正如您所注意到的,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: ...})
<小时/>PS。您问题中定义 tf.Variable(tf.placeholder(...), ...) 的代码只是定义一个变量,其 初始值为由占位符提供。这可能不是您想要的,因为优化器创建的训练操作将仅使用分配给变量的值,并忽略您提供给占位符的任何内容(在初始化步骤之后)。

关于machine-learning - 使用占位符作为 tensorflow 变量(出现错误!),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40647769/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com