スパーステンソル自体または密テンソルとの乗算は、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の掛け算は正常に動作します。
_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になります)。
最近、tf.sparse_tensor_dense_matmul(...)
が追加されました。これにより、疎行列を密行列で乗算できます。
https://www.tensorflow.org/versions/r0.9/api_docs/python/sparse_ops.html#sparse_tensor_dense_matmul
のようだ
tf.sparse_matmul(
a,
b,
transpose_a=None,
transpose_b=None,
a_is_sparse=None,
b_is_sparse=None,
name=None
)
2つのSparseTensors
の乗算用ではありません。
a
とb
はTensors
ではなくSparseTensors
です。そして私はそれを試しました、それはSparseTensors
では機能しません。
tf.sparse_matmulは、スパースタイプではない2つの密なテンソルを乗算するためのデータ構造です。与えられた行列(または2つの行列の両方)に多くのゼロ値がある場合、その関数はテンソル乗算の最適化されたバージョンです。繰り返しますが、スパーステンソルデータ型は受け入れません。密なテンソルデータタイプを受け入れます。値がほとんどゼロの場合、計算が速くなる可能性があります。
私の知る限り、2つのスパースタイプのテンソル乗算の実装はありません。しかし、tf.sparse_tensor_dense_matmul(x、y)である1つのスパース1つだけの密度!
答えをより完全にするために:
tf.sparse_matmul(
a,
b,
transpose_a=None,
transpose_b=None,
a_is_sparse=None,
b_is_sparse=None,
name=None
)
同様に存在します: