我在TensorFlow中进行矩阵分解,我想使用Spicy.sparse中的coo_matrix,因为它使用更少的内存,并且可以很容易地将我的所有数据放入我的矩阵中来训练数据。
是否可以使用coo_matrix来初始化张量流中的变量?
或者我是否必须创建一个会话并使用sess.run()和feed_dict将我获得的数据提供给tensorflow。
我希望你理解我的问题和我的问题否则发表评论,我会尝试解决它。
答案 0 :(得分:11)
TensorFlow与scipy.sparse.coo_matrix
最接近的是tf.SparseTensor
,它是tf.Tensor
的稀疏等价物。将coo_matrix
提供给您的程序可能最简单。
tf.SparseTensor
是COO矩阵的略微概括,其中张量表示为三个密集tf.Tensor
个对象:
indices
:N
x D
个tf.int64
值矩阵,其中每行代表非零值的坐标。 N
是非零的数量,D
是等效密集张量的等级(在矩阵的情况下为2)。values
:长度 - N
值向量,其中元素i
是其坐标在i
indices
上给出的元素的值}。dense_shape
:D
的长度 - 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})