2017-04-26 65 views
1

我试图修改TensorFlow MNIST示例,以便在生成结果之前将占位符输入值传递给操作变量。Tensorflow - 将占位符值分配给变量

例如:

import tensorflow as tf 

# create placeholder/weights/biases 
input_x = tf.placeholder(tf.float32, [None, 784]) 
input_W = tf.Variable(tf.zeros([784, 10])) 
input_b = tf.Variable(tf.zeros([10])) 

# Create the new variable 
var_x = tf.Variable(tf.zeros([784]), trainable=False) 

# Perform an arbitrary manipulation on MNIST input, and assign to var_x 
for i in range(0,784): 
    var_x[i].assign(input_x[i]/2) 

input_Y = tf.matmul(var_x, input_W) + input_b 

在上面的例子中,我通过占位符值input_X成var_X,哪里可以通过权重相乘,以获得输出结果之前,对值执行任意操作,。

,我发现了以下错误的tf.matmul:

ValueError: Shape must be rank 2 but is rank 1 for 'MatMul' (op: 'MatMul') with input shapes: [784], [784,10]. 

我很困惑,为什么在上面的例子中,这个工程:

tf.matmul(input_x, input_W) + input_b 

但这并不:

tf.matmul(var_x, input_W) _ input_b 

由于input_x和var_x都应该是784长度的向量。

我基本上希望它与正常MNIST示例中的矩阵乘法完全相同,但使用变量而不是占位符。

这似乎应该是超级直观,但我是TensorFlow的新手,尽管阅读了很多教程/ SO问题,但我从未在任何地方见过这种特殊场景。

在此先感谢您的任何建议!

回答

0

由于input_x和var_x都应该是784长度的向量。

这并不完全正确。 Input_x的形状为[无,784],var_x的形状为[784]。

不幸的是,我完全不明白你正在尝试做的...

我基本上希望它是完全一样的矩阵乘法你不得不在正常的MNIST例子,但使用一个变量而不是占位符。

如果你想使用一个变量,而不是一个占位符,你可以说

input_x = tf.Variable(tf.float32, preloaded_digits_numpy_array) 

而离开代码的其余部分像它...

+0

感谢您的答复,对不起,如果它不清楚。我想正常地将数字加载到占位符中,但在计算结果之前对这些值进行一些操作。 – inkbleed

+0

对不起,我的评论去掉了。 我想补充: 所以在上面的例子中,我将占位符的馈送值减半。同样,我可能想占用占位符值,并将它们合并或平均它们等等。我可能希望最终对多个变量执行此操作,因此input_x需要与更新/ matmul'd变量分开。 希望更清楚!欢呼 – inkbleed

+0

嗯,在这种情况下,为什么不用numpy来执行这个操作,然后把它送入图表? – rmeertens