将Tensor对象中的实际数值分配给Tensorflow中的numpy数组

时间:2016-06-20 18:00:20

标签: numpy tensorflow

我试图将Tensor对象中的矩阵切割为numpy矩阵,并在某些部分计算中使用它。 但是从Tensor对象到numpy数组的赋值不起作用如下。

import tensorflow as tf
import numpy as np

def assignC():
    C_copy = np.zeros((2,2))
    C = tf.matmul(tf.transpose(x), x)
    C_copy[0,0] = C[0,0]
    #C_copy[0,0] = C[0,0].eval() # error saying "You must feed a value for  placeholder tensor 'Placeholder' with dtype float" at line 17
    print(C_copy[0,0])
    return C_copy

sess = tf.InteractiveSession()

from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)

x = tf.placeholder(tf.float32, [None, 784])

sess.run(tf.initialize_all_variables())
for i in range(1):
    batch_xs, batch_ys = mnist.train.next_batch(100)
    print(sess.run(tf.identity(assignC()), feed_dict={x: batch_xs}))

最终出现错误“ValueError:设置带序列的数组元素”。在第7行。 有人会告诉我如何在Tensor对象中提取数值并将其分配给非张量流对象吗?

2 个答案:

答案 0 :(得分:0)

您应该避免在TensorFlow图中引入python / numpy代码。

如果要切片数组,可以使用tf.slice

例如,如果您想获得C[0, 0]

C = tf.constant([[1., 2.], [3., 4.]])
res = tf.slice(C, [0, 0], [1, 1])

您得到的错误来自C_copy是一个庞大的浮动数组,并且您尝试将C_copy[0, 0]设置为tf.Tensor

答案 1 :(得分:0)

TLDR;使用.eval(feed_dict={x:batch_xs})

你正在混合“具体的张量” - 表示实际值的对象,如numpy数组)和“抽象张量” - 表示特定计算的对象,必须在使用前进行评估。

当你执行C[0,0]时,C是一个抽象的Tensor,C[0,0]会变成为获取元素所需的SliceSqueeze操作序列,而我猜numpy认为这是一个序列。无论哪种方式,将其设置为数组元素都不起作用,因为numpy需要具体的值,因此需要先使用evalsession.run

进行评估