为什么这不起作用:

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中。

最佳答案

TL; DR

tf.sparse_tensor_dense_matmul代替tf.sparse_matmul;在documentation中查找使用tf.nn.embedding_lookup_sparse的替代方法。

关于稀疏矩阵和SparseTensors

这个问题不是特定于sparse_placeholder的问题,而是由于tensorflow术语的混淆。

您的矩阵稀疏。然后您有SparseTensor。两者相关但概念不同。


SparseTensor是一种索引其值的结构,可以有效地表示稀疏矩阵或张量。
稀疏矩阵是主要用0填充的矩阵。在tensorflow的文档中,它通常不引用SparseTensor,而是引用主要用Tensor填充的普通旧0


因此,重要的是要弄清楚函数参数的期望类型。

因此,例如,在the documentation of tf.matmul中,操作数必须是纯Tensor而不是SparseTensor,与xxx_is_sparse标志的值无关,这可以解释您的错误。当这些标志为True时,tf.sparse_matmul实际期望的实际上是(密集)Tensor。换句话说,这些标志用于some optimization purposes而不是输入类型约束。 (顺便说一下,这些优化似乎仅对rather larger matrices有用)。

08-24 21:39