Python 将可训练变量输入TensorFlow中的占位符

Python 将可训练变量输入TensorFlow中的占位符,python,optimization,tensorflow,placeholder,Python,Optimization,Tensorflow,Placeholder,假设我想在一些样本(以及变量)上训练一个模型,这些样本只在运行时已知 案例研究:主成分分析(X W=Y) (这只是一个复杂得多的模型的简化) 以这个简单的PCA模型为例,其中只有特征维度(Din和Dout)是已知和固定的 W = tf.Variable(tf.zeros([D_in, D_out]), name='weights', trainable=True) X = tf.placeholder(tf.float32, [None, D_in], name='placeholder_la

假设我想在一些样本(以及变量)上训练一个模型,这些样本只在运行时已知

案例研究:主成分分析(X W=Y)

(这只是一个复杂得多的模型的简化)

以这个简单的PCA模型为例,其中只有特征维度(Din和Dout)是已知和固定的

W = tf.Variable(tf.zeros([D_in, D_out]), name='weights', trainable=True)
X = tf.placeholder(tf.float32, [None, D_in], name='placeholder_latent')

Y_est = tf.matmul(X, W)
loss = tf.reduce_sum((Y_tf-Y_est)**2)

train_step = tf.train.AdamOptimizer(0.001).minimize(loss)
假设现在我们生成一些数据

W_true = np.random.randn(D_in, D_out)
X_true = np.random.randn(N, D_in)
Y_true = np.dot(X_true, W_true)
Y_tf = tf.constant(Y_true.astype(np.float32))
一旦我知道我的训练数据的维度,我就可以声明将馈送到占位符
X
潜在
变量进行优化

latent = tf.Variable(tf.zeros([N, D_in]), name='latent', trainable=True)
init_op = tf.global_variables_initializer()
在那之后,我想做的是将这个
潜在的
变量输入占位符
X
,然后运行优化

with tf.Session() as sess:
  sess.run(init_op)
  for n in range(10000):
    sess.run(train_step, feed_dict={X : sess.run(latent)})
    if (n+1) % 1000 == 0:
      print('iter %i, %f' % (n+1, sess.run(loss, feed_dict={X : sess.run(latent)}))) 
问题在于,优化程序不会优化
W
潜在的
,而只优化
W
。我还尝试在不进行求值的情况下直接输入变量,但出现以下错误:

ValueError: setting an array element with a sequence.
你曾经遇到过这样的问题吗?你知道如何克服这个问题吗?是否有任何可能的解决方法来优化占位符


顺便说一句,我正在将TensorFlow 1.1.0rc0与Python 2.7.13一起使用
;损失=tf.减少总和((Y\u tf-Y\u est)**2)。因此,潜在未参与模型,也不会进行优化。@S.Stas“潜在未参与模型”是什么意思?X只是一个占位符,由latentIt提供。这意味着,基本上,你试图找到解方程XW=Y的W,这样损失函数f(Y-Y_真)将最小化。因此,f,即损失,取决于X和W。然而,由于X是您的输入(即观察/收集的数据),为了最小化损失,您通过自变量W取f的梯度,而不是X。因为在您的情况下,X是潜在X=g(潜在)的函数,因此要求算法优化X-或潜在-与您正在求解的方程相矛盾。