在TensorFlow中使用coo_matrix

时间:2017-03-02 16:04:31

标签: tensorflow sparse-matrix matrix-factorization

我在TensorFlow中进行矩阵分解,我想使用Spicy.sparse中的coo_matrix,因为它使用更少的内存,并且可以很容易地将我的所有数据放入我的矩阵中来训练数据。

是否可以使用coo_matrix来初始化张量流中的变量?

或者我是否必须创建一个会话并使用sess.run()和feed_dict将我获得的数据提供给tensorflow。

我希望你理解我的问题和我的问题否则发表评论,我会尝试解决它。​​

1 个答案:

答案 0 :(得分:11)

TensorFlow与scipy.sparse.coo_matrix最接近的是tf.SparseTensor,它是tf.Tensor的稀疏等价物。将coo_matrix提供给您的程序可能最简单。

tf.SparseTensor是COO矩阵的略微概括,其中张量表示为三个密集tf.Tensor个对象:

  • indicesN x Dtf.int64值矩阵,其中每行代表非零值的坐标。 N是非零的数量,D是等效密集张量的等级(在矩阵的情况下为2)。
  • values:长度 - N值向量,其中元素i是其坐标在i indices上给出的元素的值}。
  • dense_shapeD的长度 - tf.int64向量,代表等效密集张量的形状。

例如,您可以使用以下代码,该代码使用tf.sparse_placeholder()定义您可以提供的tf.SparseTensor,以及代表实际提供值的tf.SparseTensorValue

sparse_input = tf.sparse_placeholder(dtype=tf.float32, shape=[100, 100])
# ...
train_op = ...

coo_matrix = scipy.sparse.coo_matrix(...)

# Wrap `coo_matrix` in the `tf.SparseTensorValue` form that TensorFlow expects.
# SciPy stores the row and column coordinates as separate vectors, so we must 
# stack and transpose them to make an indices matrix of the appropriate shape.
tf_coo_matrix = tf.SparseTensorValue(
    indices=np.array([coo_matrix.rows, coo_matrix.cols]).T,
    values=coo_matrix.data,
    dense_shape=coo_matrix.shape)

coo_matrix转换为tf.SparseTensorValue后,您可以直接向sparse_input提供tf.SparseTensorValue

sess.run(train_op, feed_dict={sparse_input: tf_coo_matrix})