tf.sparse_to_dense: форма должна иметь ранг 1, но ранг 0 - PullRequest
0 голосов
/ 09 декабря 2018

Мои коды:

def f(x):
    try:
        import tensorflow as tf
        # x is (None, 10, 2)
        idx = K.cast(x*15.5+15.5, "int32")
        z = tf.sparse_to_dense(idx, 32, 1.0, 0.0, name='sparse_tensor')
        print('z.shape={0}'.format(z.shape))
    except Exception as e:
        print(e)
    return x[:, :, 0:2]

drop_out = Lambda(lambda x: f(x), 
                  output_shape=drop_output_shape, name='projection')(reshape_out)

x - тензор (None, 10, 2), где есть 10 индексов / координат.Попытка сгенерировать (None, 32, 32) тензор z.Я получил следующую ошибку:

Shape must be rank 1 but is rank 0 for 'projection_14/sparse_tensor' (op: 'SparseToDense') with input shapes: [?,10,2], [], [], [].

Как это исправить?Спасибо

1 Ответ

0 голосов
/ 10 декабря 2018

Конкретная ошибка, которую вы видели, это попытка сказать, что ваш output_shape должен быть 1-D Тензор, как (32,), а не 0-D Тензор, как у вас там, 32.Но я беспокоюсь, что это простое изменение не решит вашу проблему.

Я не понимаю, почему ваш x является трехмерным тензором, когда вы сказали, что у вас всего 10 индексов.Технически говоря, sparse_indices может быть двумерным тензором не более .Мое понимание tf.sparse_to_dense заключается в том, что это очень похоже на создание разреженного тензора.Так что число 2 в вашем (10, 2) уже решено, что тензор вывода будет 2-D.None, как и вариант размера выборки, должен обрабатываться по-разному.

Следуя этой логике, вы можете обнаружить еще одну проблему: output_shape должно быть (32, 32), а не (32,), как упомянуто простое исправление.выше.Длина кортежа должна соответствовать форме (в частности, последней оси) sparse_indices.

Учитывая все это, я думаю, что MVCE, только тензорный поток, имитирующий ваш пример, может быть:

import numpy as np
import tensorflow as tf

x = tf.placeholder(tf.float32, shape=(10, 2))
idx = tf.cast(x*15.5+15.5, tf.int32)
z = tf.sparse_to_dense(idx, (32, 32), 1.0, 0.0, name='sparse_tensor')

with tf.Session() as sess:
    print(sess.run(
        z, feed_dict={x: np.arange(20, dtype=np.float32).reshape((10, 2))/20})
    )

Просто для того, чтобы указать: * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Функция будет удалена в следующей версии. Инструкции по обновлению: создайте tf.sparse.SparseTensor и используйте взамен tf.sparse.to_dense. "

...