Tensorflow: tf.matmul() schlägt fehl, wenn Matrizen dünn besetzt sind, selbst wenn a_is_sparse gesetzt ist. Kryptischer Fehler.

Erstellt am 9. Juli 2016  ·  3Kommentare  ·  Quelle: tensorflow/tensorflow

tf.matmul(A, B, a_is_sparse=True) schlägt bei a = ops.convert_to_tensor(a, name="a") mit kryptischem Fehler fehl.

Beispielcode:

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)})

Fehler:
Zeile 12, in
_ = sess.run(tf.matmul(x, y, a_is_sparse=True), feed_dict={
Datei "/usr/local/lib/python2.7/site-packages/tensorflow/python/ops/math_ops.py", Zeile 1189, in Matmul
a = ops.convert_to_tensor(a, name="a")
Datei "/usr/local/lib/python2.7/site-packages/tensorflow/python/framework/ops.py", Zeile 620, in convert_to_tensor
ret = Conversion_func(Wert, dtype=dtype, name=name, as_ref=as_ref)
Datei "/usr/local/lib/python2.7/site-packages/tensorflow/python/ops/constant_op.py", Zeile 179, in _constant_tensor_conversion_function
Rückgabekonstante (v, dtype=dtype, name=name)
Datei "/usr/local/lib/python2.7/site-packages/tensorflow/python/ops/constant_op.py", Zeile 162, in konstant
tensor_util.make_tensor_proto(value, dtype=dtype, shape=shape))
Datei "/usr/local/lib/python2.7/site-packages/tensorflow/python/framework/tensor_util.py", Zeile 421, in make_tensor_proto
tensor_proto.string_val.extend([compat.as_bytes(x) für x in proto_values])
Datei "/usr/local/lib/python2.7/site-packages/tensorflow/python/util/compat.py", Zeile 44, in as_bytes
raise TypeError('Binär- oder Unicode-String erwartet, %r erhalten' % bytes_or_text)
TypeError: Erwarteter Binär- oder Unicode-String, got

Wird durch explizites Konvertieren von Sparse in Dense Tensor vor der Multiplikation behoben:

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)})

Hilfreichster Kommentar

Die Flags a_is_sparse und b_is_sparse zeigen nicht an, dass die Operanden SparseTensor s sind. Stattdessen sind sie algorithmische Hinweise, um einen effizienteren Algorithmus für die beiden dichten Tensor Operanden aufzurufen.

Um einen SparseTensor und einen Dense Tensor zu kombinieren, können Sie stattdessen tf.sparse_tensor_dense_matmul() verwenden.

Alle 3 Kommentare

@concretevitamin , Wird dies voraussichtlich funktionieren oder ist dies eine bekannte Einschränkung von spärlichen Tensoren.

Die Flags a_is_sparse und b_is_sparse zeigen nicht an, dass die Operanden SparseTensor s sind. Stattdessen sind sie algorithmische Hinweise, um einen effizienteren Algorithmus für die beiden dichten Tensor Operanden aufzurufen.

Um einen SparseTensor und einen Dense Tensor zu kombinieren, können Sie stattdessen tf.sparse_tensor_dense_matmul() verwenden.

Die Flags a_is_sparse und b_is_sparse zeigen nicht an, dass die Operanden SparseTensors sind. Stattdessen sind sie algorithmische Hinweise, um einen effizienteren Algorithmus für die beiden dichten Tensor-Operanden aufzurufen.

Dies sollte Teil der Dokumentation von matmut sein. Es ist sehr unklar, was das Flag a_is_sparse macht.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen