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

Machine learning 使用占位符作为tensorflow变量(获取错误!),machine-learning,tensorflow,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:未在未知

我试图在我的图表中使用占位符作为变量(这样我以后就可以对它进行优化),但我不知道最好的方法。我试过这个:

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()

即使您对这个错误并不完全熟悉,如果您能指导我如何构建一个复制变量,该变量接受占位符的值,我也会非常感激。
谢谢

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

那么,如何优化美联储的价值?我可以想出两个选择:

  • 您可以先为变量分配一个输入值,然后针对该变量进行优化,而不是输入一个
    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)
    
  • 您可以使用低级函数在一个步骤中获得相对于占位符的损失梯度。然后可以在Python中使用该渐变:

    var = tf.placeholder(tf.float32, ...)
    # ...
    mse_loss = ...
    var_grad, = tf.gradients(loss, [var])
    
    var_grad_val = sess.run(var_grad, feed_dict={var: ...})
    


  • 问题中的代码定义了一个
    tf.变量(tf.占位符(…),…)
    ,它只是定义了一个变量,其初始值由占位符提供。这可能不是您想要的,因为优化器创建的训练op将只使用分配给变量的值,而忽略您提供给占位符的任何内容(在初始化步骤之后)。

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

    那么,如何优化美联储的价值?我可以想出两个选择:

  • 您可以先为变量分配一个输入值,然后针对该变量进行优化,而不是输入一个
    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)
    
  • 您可以使用低级函数在一个步骤中获得相对于占位符的损失梯度。然后可以在Python中使用该渐变:

    var = tf.placeholder(tf.float32, ...)
    # ...
    mse_loss = ...
    var_grad, = tf.gradients(loss, [var])
    
    var_grad_val = sess.run(var_grad, feed_dict={var: ...})
    


  • 问题中的代码定义了一个
    tf.变量(tf.占位符(…),…)
    ,它只是定义了一个变量,其初始值由占位符提供。这可能不是您想要的,因为优化器创建的训练op将只使用分配给变量的值,而忽略您提供给占位符的任何内容(在初始化步骤之后)。

    您可以粘贴完整堆栈跟踪吗?当然,这里有一个链接,似乎我无法对非静态大小的变量进行优化是的,您可能需要为占位符提供完整的形状。您可以粘贴完整的堆栈跟踪吗?当然,这里有一个链接似乎无法对非静态大小的变量进行优化是的,您可能需要为占位符提供完整的形状。对于1),当您直接将占位符输入变量时,赋值操作不会自动添加吗?可以添加一个赋值操作,但您必须记住使用提要命令运行
    var.initializer
    。它可以工作,但选项2可能更好。。。尤其是当形状可以改变的时候。啊,好吧,这里的问题是Adam优化器需要创建辅助变量,要做到这一点,它们需要与输入的形状相同。现在它依赖于静态形状,因为几乎所有变量都有静态形状(当权重形状改变时,很可能不容易定义这些辅助变量的含义)。你能试试选项2吗,或者是有什么原因它对你不起作用吗?对于1),当你直接将占位符输入变量时,赋值操作不会自动添加吗?可以添加一个赋值操作,但您必须记住使用提要命令运行
    var.initializer
    。它可以工作,但选项2可能更好。。。尤其是当形状可以改变的时候。啊,好吧,这里的问题是Adam优化器需要创建辅助变量,要做到这一点,它们需要与输入的形状相同。现在它依赖于静态形状,因为几乎所有变量都有静态形状(当权重形状改变时,很可能不容易定义这些辅助变量的含义)。你能试试选项2吗,或者是有什么原因它不适合你?