web-dev-qa-db-ja.com

TensorFlowにはスパーステンソル乗算が実装されていますか?

スパーステンソル自体または密テンソルとの乗算は、TensorFlowでは機能しないようです。次の例

from __future__ import print_function
import tensorflow as tf

x = tf.constant([[1.0,2.0],
                 [3.0,4.0]])
y = tf.SparseTensor(indices=[[0,0],[1,1]], values=[1.0,1.0], shape=[2,2])
z = tf.matmul(x,y)

sess = tf.Session()
sess.run(tf.initialize_all_variables())
print(sess.run([x, y, z]))

エラーメッセージで失敗する

TypeError: Input 'b' of 'MatMul' Op has type string that does not match type 
float32 of argument 'a'

両方のテンソルは、乗算opなしで評価するとわかるように、float32型の値を持っています。 yとそれ自体の乗算は、同様のエラーメッセージを返します。それ自体とxの掛け算は正常に動作します。

23
chris

_tf.SparseTensor_の汎用乗算は、現在TensorFlowに実装されていません。ただし、3つの部分的なソリューションがあり、どちらを選択するかは、データの特性によって異なります。

  • _tf.SparseTensor_と_tf.Tensor_がある場合、 tf.sparse_tensor_dense_matmul() を使用してそれらを乗算できます。これは、高密度化されたときにテンソルの1つが大きすぎてメモリに収まらない場合、次のアプローチよりも効率的です。ドキュメントには、これらの2つの方法を決定する方法に関するより多くのガイダンスがあります。 first引数として_tf.SparseTensor_を受け入れるため、正確な問題を解決するには_adjoint_a_を使用する必要があることに注意してください。および_adjoint_b_引数、および結果を転置します。

  • 2つの疎なテンソルがあり、それらを乗算する必要がある場合、最も単純な(最もパフォーマンスが高くない場合)方法は、それらを密に変換し、_tf.matmul_を使用することです。

    _a = tf.SparseTensor(...)
    b = tf.SparseTensor(...)
    
    c = tf.matmul(tf.sparse_tensor_to_dense(a, 0.0),
                  tf.sparse_tensor_to_dense(b, 0.0),
                  a_is_sparse=True, b_is_sparse=True)
    _

    オプションの_a_is_sparse_および_b_is_sparse_引数は、「a(またはb)は密な表現を持っていますが、そのエントリの多数がゼロであることを意味します。別の乗算アルゴリズムの使用をトリガーします。

  • スパースベクトルによる(潜在的に大きくシャーディングされた)密な行列乗算の特殊なケースで、ベクトルの値が0または1の場合、 _tf.nn.embedding_lookup_ 演算子の方が適切な場合があります。 このチュートリアル は、埋め込みを使用する可能性がある場合と、演算子を呼び出す方法をより詳細に説明しています。

  • スパースmatrixby(潜在的に大きく、シャーディングされた)密行列の特殊なケースでは、 tf.nn.embedding_lookup_sparse() が適切な場合があります。この関数は、1つまたは2つの_tf.SparseTensor_オブジェクトを受け入れます。_sp_ids_はゼロ以外の値を表し、オプションの_sp_weights_はそれらの値を表します(それ以外の場合はデフォルトで1になります)。

32
mrry

最近、tf.sparse_tensor_dense_matmul(...)が追加されました。これにより、疎行列を密行列で乗算できます。

https://www.tensorflow.org/versions/r0.9/api_docs/python/sparse_ops.html#sparse_tensor_dense_matmul

https://github.com/tensorflow/tensorflow/issues/1241

12
momeara

のようだ

tf.sparse_matmul(
    a,
    b,
    transpose_a=None,
    transpose_b=None,
    a_is_sparse=None,
    b_is_sparse=None,
    name=None
)

2つのSparseTensorsの乗算用ではありません。

abTensorsではなくSparseTensorsです。そして私はそれを試しました、それはSparseTensorsでは機能しません。

2
chunyang.wen

tf.sparse_matmulは、スパースタイプではない2つの密なテンソルを乗算するためのデータ構造です。与えられた行列(または2つの行列の両方)に多くのゼロ値がある場合、その関数はテンソル乗算の最適化されたバージョンです。繰り返しますが、スパーステンソルデータ型は受け入れません。密なテンソルデータタイプを受け入れます。値がほとんどゼロの場合、計算が速くなる可能性があります。

私の知る限り、2つのスパースタイプのテンソル乗算の実装はありません。しかし、tf.sparse_tensor_dense_matmul(x、y)である1つのスパース1つだけの密度!

1
M. Balcilar

答えをより完全にするために:

tf.sparse_matmul(
    a,
    b,
    transpose_a=None,
    transpose_b=None,
    a_is_sparse=None,
    b_is_sparse=None,
    name=None
)

同様に存在します:

https://www.tensorflow.org/api_docs/python/tf/sparse_matmul

0
pcejrowski