[英]Scaling columns of a Sparse Tensor by a vector in tensorflow
假設 A 是一個稀疏的二維二進制張量 (NxN),B 是一個向量 (1xN)。 我想按 B 縮放 A 的列: A_{i, j} <- A_{i, j} x B_{j}
我正在尋找一種有效的方法來做到這一點。 目前我嘗試了兩種方法,但它們太慢了:
tf.sparse_tensor_dense_matmul(A, BD)
。 這將返回一個密集矩陣,因此該方法效率不高。tf.SparseTensor(A.indices, tf.map_fn(func, (A.values, A.indices[:, 1]), dtype=tf.float32), A.dense_shape)
。 這將返回一個稀疏張量,但似乎map_fn
或SparseTensor
函數之一是瓶頸。謝謝!
更快的解決方案可能是在您的張量B
上調用gather
以便能夠直接乘以A
的值。 另一種選擇是使用tf.sparse.map_values
,使用tf.gather
創建更新向量。
在大小為1000x1000
的 99% 空稀疏矩陣上:
>>> %timeit tf.sparse.SparseTensor(A.indices, A.values*tf.gather(B,A.indices[:,1]), A.dense_shape)
855 µs ± 86 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
map_values
方法:
>>> %timeit tf.sparse.map_values(tf.multiply, A, tf.gather(B,A.indices[:,1]))
978 µs ± 73 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
與sparse_dense_matmul
方法相比:
>>> %timeit tf.sparse.from_dense(tf.sparse.sparse_dense_matmul(A,tf.linalg.diag(B)))
26.7 ms ± 2.24 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.