为什么这不起作用:
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有用)。