我试图将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对象中提取数值并将其分配给非张量流对象吗?
答案 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]
会变成为获取元素所需的Slice
和Squeeze
操作序列,而我猜numpy认为这是一个序列。无论哪种方式,将其设置为数组元素都不起作用,因为numpy需要具体的值,因此需要先使用eval
或session.run