为什么这不起作用:
pl_input = tf.sparse_placeholder('float32',shape=[None,30])
W = tf.Variable(tf.random_normal(shape=[30,1]), dtype='float32')
layer1a = tf.sparse_matmul(pl_input, weights, a_is_sparse=True, b_is_sparse=False)
错误消息是
TypeError: Failed to convert object of type <class 'tensorflow.python.framework.sparse_tensor.SparseTensor'> to Tensor. Contents: SparseTensor(indices=Tensor("Placeholder_11:0", shape=(?, ?), dtype=int64), values=Tensor("Placeholder_10:0", shape=(?,), dtype=float32), dense_shape=Tensor("Placeholder_9:0", shape=(?,), dtype=int64)). Consider casting elements to a supported type.
我希望创建一个我从中检索批次的SparseTensorValue,然后将批处理提供给pl_input。
答案 0 :(得分:3)
使用tf.sparse_tensor_dense_matmul
代替tf.sparse_matmul
;使用tf.nn.embedding_lookup_sparse
查看documentation替代方案。
SparseTensors
问题并非针对sparse_placeholder
,而是由于张量流的术语混淆。
你有稀疏的矩阵。然后你有SparseTensor
。两者都是相关但不同的概念。
SparseTensor
是一个对其值进行索引的结构,可以有效地表示稀疏矩阵或张量。0
的矩阵。在tensorflow的文档中,通常不引用SparseTensor
,而是引用主要由Tensor
填充的普通旧0
。因此,重要的是要查看函数的预期类型,以便弄清楚。
例如,在the documentation of tf.matmul
中,操作数必须是普通Tensor
而不是SparseTensor
s,与xxx_is_sparse
标志的值无关,这解释了错误。当这些标志为True
时,tf.sparse_matmul
实际上期望的是(密集的)Tensor
。换句话说,这些标志用于some optimization purposes而不是输入类型约束。 (顺便说一下,这些优化似乎只对rather larger matrices有用。