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)
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)
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吗,或者是有什么原因它不适合你?