Tensorflow: a_is_sparseが設定されていても、行列がスパースの場合、tf.matmul()は失敗します。 不可解なエラー。

作成日 2016年07月09日  ·  3コメント  ·  ソース: tensorflow/tensorflow

tf.matmul(A、B、a_is_sparse = True)は、a = ops.convert_to_tensor(a、name = "a")で失敗し、不可解なエラーが発生します。

コード例:

import tensorflow as tf
import numpy as np

x = tf.sparse_placeholder(tf.float32)
y = tf.Variable(tf.random_uniform([9, 9], minval=0.0, maxval=1.0, dtype=tf.float32))

with tf.Session() as sess:
    sess.run(tf.initialize_all_variables())
    indices = np.array([[3, 2], [4, 5]], dtype=np.int64)
    values = np.array([1.0, 2.0], dtype=np.float32)
    shape = np.array([9, 9], dtype=np.int64)
    _ = sess.run(tf.matmul(x, y), feed_dict={
        x: tf.SparseTensorValue(indices, values, shape)})

エラー:
12行目
_ = sess.run(tf.matmul(x、y、a_is_sparse = True)、feed_dict = {
ファイル "/usr/local/lib/python2.7/site-packages/tensorflow/python/ops/math_ops.py"、1189行目、matmul
a = ops.convert_to_tensor(a、name = "a")
convert_to_tensorのファイル "/usr/local/lib/python2.7/site-packages/tensorflow/python/framework/ops.py"、行620
ret = Conversion_func(value、dtype = dtype、name = name、as_ref = as_ref)
ファイル "/usr/local/lib/python2.7/site-packages/tensorflow/python/ops/constant_op.py"、179行目、_constant_tensor_conversion_function
戻り定数(v、dtype = dtype、name = name)
ファイル "/usr/local/lib/python2.7/site-packages/tensorflow/python/ops/constant_op.py"、行162、定数
tensor_util.make_tensor_proto(value、dtype = dtype、shape = shape))
make_tensor_protoのファイル "/usr/local/lib/python2.7/site-packages/tensorflow/python/framework/tensor_util.py"、行421
tensor_proto.string_val.extend([compat.as_bytes(x)for x in proto_values])
ファイル "/usr/local/lib/python2.7/site-packages/tensorflow/python/util/compat.py"、44行目、as_bytes
タイプエラーを発生させます( '予期されるバイナリまたはユニコード文字列、%rを取得しました'%bytes_or_text)
TypeError:予期されるバイナリまたはユニコード文字列、取得

乗算の前にスパーステンソルからデンソルテンソルに明示的に変換することで修正されました。

import tensorflow as tf
import numpy as np

x = tf.sparse_placeholder(tf.float32)
z = tf.sparse_tensor_to_dense(x)
y = tf.Variable(tf.random_uniform([9, 9], minval=0.0, maxval=1.0, dtype=tf.float32))

with tf.Session() as sess:
    sess.run(tf.initialize_all_variables())
    indices = np.array([[3, 2], [4, 5]], dtype=np.int64)
    values = np.array([1.0, 2.0], dtype=np.float32)
    shape = np.array([9, 9], dtype=np.int64)
    _ = sess.run(tf.matmul(z, y), feed_dict={
        x: tf.SparseTensorValue(indices, values, shape)})

最も参考になるコメント

フラグa_is_sparseおよびb_is_sparseは、オペランドがSparseTensorことを示していません。 代わりに、これらは2つの密なTensorオペランドでより効率的なアルゴリズムを呼び出すためのアルゴリズムのヒントです。

SparseTensorとDenseTensorを組み合わせるには、代わりにtf.sparse_tensor_dense_matmul()使用できます。

全てのコメント3件

@concretevitamin 、これは機能することが期待されていますか、それともスパーステンソルの既知の制限ですか。

フラグa_is_sparseおよびb_is_sparseは、オペランドがSparseTensorことを示していません。 代わりに、これらは2つの密なTensorオペランドでより効率的なアルゴリズムを呼び出すためのアルゴリズムのヒントです。

SparseTensorとDenseTensorを組み合わせるには、代わりにtf.sparse_tensor_dense_matmul()使用できます。

フラグa_is_sparseおよびb_is_sparseは、オペランドがSparseTensorsであることを示していません。 代わりに、これらは2つの密なTensorオペランドでより効率的なアルゴリズムを呼び出すためのアルゴリズムのヒントです。

これは、matmutのドキュメントの一部である必要があります。 フラグa_is_sparseが何をするのかは非常に不明確です。

このページは役に立ちましたか?
0 / 5 - 0 評価