在TensorFlow中传递和使用稀疏矩阵

时间:2018-05-25 13:26:53

标签: python tensorflow

说我有一个矩阵:

X = [
    [0, 0, 0, 0, 0],
    [0, 0, 1, 0, 0],
    [0, 0, 0, 0, 0],
    [2, 0, 0, 3, 0],
    [0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0],
    [0, 4, 0, 0, 0]
]

但它以稀疏格式存储:

# [row, column, value]
X_sparse = [
    [1, 2, 1],
    [3, 0, 2],
    [3, 3, 3]
    [6, 1, 4],
]

我也有一个载体

b = [1,2,3,4,5]

我想将X_sparse作为数据传递给TensorFlow,然后将其与b相乘(即np.dot(X, b))。在TensorFlow中执行此操作的正确方法是什么?此外,这是一个玩具示例,而在现实生活中X有许多行和列,所以我不想使用它转换为非稀疏格式。

2 个答案:

答案 0 :(得分:3)

如果不使用密集张量表示(SELECT DISTINCT f.name, i.name, changes.a, changes.b, src, dest, port FEOM changes INNER JOIN firewall f ON changes.a = f.id INNER JOIN interface i ON changes.b = i.id ORDER BY changes.id DESC; ),我看不到一种简单的方法。然而,Tensorflow是为大型矩阵的操作而构建的,所以在很多情况下它应该不是问题...

一个简单的例子:

tf.sparse_tensor_to_dense()

答案 1 :(得分:0)

那时可能没有更好的选择了,现在有一个功能-转换为稠密后进行矩阵乘法会使整个事情变得毫无意义...

import tensorflow as tf
import numpy as np

A_vals = np.array([
    [1, 2, 1],
    [3, 0, 2],
    [3, 3, 3],
    [6, 1, 4],
])  
A_sparse = tf.SparseTensor(A_vals[:,:2], tf.cast(A_vals[:,2], tf.float32), [7, 5])
b = tf.constant([1,2,3,4,5], tf.float32)

# sparse-dense matrix multiplication
res = tf.sparse.sparse_dense_matmul(A_sparse, b[:,None])