Python tensorflow中稠密向量与稀疏矩阵的乘积

Python tensorflow中稠密向量与稀疏矩阵的乘积,python,tensorflow,Python,Tensorflow,在tensorflow中,有没有一种简单的方法可以将稀疏矩阵和稠密张量相乘? 我试过了 但我得到了“TypeError:‘Tensor’对象不支持项目分配。”我尝试了 并得到“ValueError:仅变量支持切片赋值” 将vec转换为带有vec=tf.get_variable('vec',初始值设定项=tf.zero(densite_vec.shape,densite_vec.dtype))的变量会产生相同的错误。有没有一种不太占用内存的方法呢?你应该使用专门为这个目的而发明的方法。您不需要创建

在tensorflow中,有没有一种简单的方法可以将稀疏矩阵和稠密张量相乘? 我试过了

但我得到了“TypeError:‘Tensor’对象不支持项目分配。”我尝试了

并得到“ValueError:仅变量支持切片赋值” 将vec转换为带有
vec=tf.get_variable('vec',初始值设定项=tf.zero(densite_vec.shape,densite_vec.dtype))
的变量会产生相同的错误。有没有一种不太占用内存的方法呢?

你应该使用专门为这个目的而发明的方法。您不需要创建自己的函数。此代码(已测试):

将tensorflow导入为tf
a=tf.SparseTensor(指数=[[0,0],[3,4]],
值=tf.常数([1.0,10]),
密集_形=[5,5])
向量=tf.常数([[2.0]、[3]、[4]、[5]、[6])
c=tf.稀疏张量密度matmul(a,vec)
使用tf.Session()作为sess:
res=sess.run(c)
打印(res)
将输出:

[[2.]
[0.]
[0.]
[60.]
[0.]]



作为参考,我的第一个答案是提到,这有点令人困惑。它将被稀疏张量参数阻塞。

只需在向量中添加一个大小为1的额外维度。tf.sparse_matmul()位于两个矩阵之间,而不是矩阵和向量之间。我尝试将向量保存为另一个稀疏矩阵并执行此操作,但这会导致“类型错误:无法将类型的对象转换为张量。内容:SparseTensor(索引=张量(“SparseTensor_6/索引:0”),shape=(2,2),dtype=int64),Value=张量(“SparseTensor_6/值:0”,shape=(2,),dtype=float32),dense_形状=张量(“SparseTensor_6/dense_形状:0,shape=(2,),dtype=int64)。考虑到铸造元素为支持类型。“我的代码是<代码> A= TF.SPARSETSENSOR(索引= [0[0],[1,1]),值= [1.0,1.0],B= TF。SfStServor(索引= [0[0],[1,0]),值= [1.0,1.0],DeNeSySt= = [2,2])TF。好的,让我做一点实验。更新了我的答案。
tf.sparse\u matmul()
(令人困惑地)做了其他事情,你是对的。
def sparse_mult(sparse_mat,dense_vec):
    vec = tf.zeros(dense_vec.shape, dense_vec.dtype)
    indices = sparse_mat.indices
    values = sparse_mat.values
    with tf.Session() as sess:
        num_vals = sess.run(tf.size(values))
    for i in range(num_vals):
        vec[indices[i,0]] += values[i] * dense_vec[indices[i,1]]
    return vec
def sparse_mult(sparse_mat,dense_vec):
    vec = tf.zeros(dense_vec.shape, dense_vec.dtype)
    indices = sparse_mat.indices
    values = sparse_mat.values
    with tf.Session() as sess:
        num_vals = sess.run(tf.size(values))
    for i in range(num_vals):
        vec = vec[indices[i,0]].assign(vec[indices[i,0]] + values[i] * dense_vec[indices[i,1]])
    return vec