Tensorflow: 当矩阵稀疏时 tf.matmul() 失败,即使设置了 a_is_sparse 也是如此。 隐性错误。

创建于 2016-07-09  ·  3评论  ·  资料来源: tensorflow/tensorflow

tf.matmul(A, B, a_is_sparse=True) 在 a = ops.convert_to_tensor(a, name="a") 上失败并出现神秘错误。

示例代码:

import tensorflow as tf
import numpy as np

x = tf.sparse_placeholder(tf.float32)
y = tf.Variable(tf.random_uniform([9, 9], minval=0.0, maxval=1.0, dtype=tf.float32))

with tf.Session() as sess:
    sess.run(tf.initialize_all_variables())
    indices = np.array([[3, 2], [4, 5]], dtype=np.int64)
    values = np.array([1.0, 2.0], dtype=np.float32)
    shape = np.array([9, 9], dtype=np.int64)
    _ = sess.run(tf.matmul(x, y), feed_dict={
        x: tf.SparseTensorValue(indices, values, shape)})

错误:
第 12 行,在
_ = sess.run(tf.matmul(x, y, a_is_sparse=True), feed_dict={
文件“/usr/local/lib/python2.7/site-packages/tensorflow/python/ops/math_ops.py”,第1189行,在matmul中
a = ops.convert_to_tensor(a, name="a")
文件“/usr/local/lib/python2.7/site-packages/tensorflow/python/framework/ops.py”,第 620 行,在 convert_to_tensor
ret = conversion_func(value, dtype=dtype, name=name, as_ref=as_ref)
文件“/usr/local/lib/python2.7/site-packages/tensorflow/python/ops/constant_op.py”,第 179 行,在 _constant_tensor_conversion_function
返回常量(v,dtype=dtype,name=name)
文件“/usr/local/lib/python2.7/site-packages/tensorflow/python/ops/constant_op.py”,第162行,常量
tensor_util.make_tensor_proto(值,dtype=dtype,shape=shape))
文件“/usr/local/lib/python2.7/site-packages/tensorflow/python/framework/tensor_util.py”,第 421 行,在 make_tensor_proto 中
tensor_proto.string_val.extend([compat.as_bytes(x) for x in proto_values])
文件“/usr/local/lib/python2.7/site-packages/tensorflow/python/util/compat.py”,第44行,as_bytes
raise TypeError('预期的二进制或 unicode 字符串,得到 %r' % bytes_or_text)
类型错误:预期的二进制或 Unicode 字符串,得到

通过在乘法之前从稀疏张量显式转换为密集张量来修复:

import tensorflow as tf
import numpy as np

x = tf.sparse_placeholder(tf.float32)
z = tf.sparse_tensor_to_dense(x)
y = tf.Variable(tf.random_uniform([9, 9], minval=0.0, maxval=1.0, dtype=tf.float32))

with tf.Session() as sess:
    sess.run(tf.initialize_all_variables())
    indices = np.array([[3, 2], [4, 5]], dtype=np.int64)
    values = np.array([1.0, 2.0], dtype=np.float32)
    shape = np.array([9, 9], dtype=np.int64)
    _ = sess.run(tf.matmul(z, y), feed_dict={
        x: tf.SparseTensorValue(indices, values, shape)})

最有用的评论

标志a_is_sparseb_is_sparse不表示操作数是SparseTensor s。 相反,它们是算法提示,可以在两个密集的Tensor操作数上调用更有效的算法。

要 matmul 稀疏张量和密集张量,您可以使用tf.sparse_tensor_dense_matmul()代替。

所有3条评论

@concretevitamin ,这是否有效,或者这是稀疏张量的已知限制。

标志a_is_sparseb_is_sparse不表示操作数是SparseTensor s。 相反,它们是算法提示,可以在两个密集的Tensor操作数上调用更有效的算法。

要 matmul 稀疏张量和密集张量,您可以使用tf.sparse_tensor_dense_matmul()代替。

标志 a_is_sparse 和 b_is_sparse 并不表示操作数是 SparseTensors。 相反,它们是在两个密集张量操作数上调用更有效算法的算法提示。

这应该是 matmut文档的一部分。 目前还不清楚a_is_sparse标志的作用。

此页面是否有帮助?
0 / 5 - 0 等级