заполнение в tf.data.Dataset в тензорном потоке - PullRequest
0 голосов
/ 05 августа 2020

Код:

a=training_dataset.map(lambda x,y: (tf.pad(x,tf.constant([[13-int(tf.shape(x)[0]),0],[0,0]])),y))

дает следующую ошибку:

TypeError: in user code:

<ipython-input-32-b25101c2110a>:1 None  *
    a=training_dataset.map(lambda x,y: (tf.pad(tensor=x,paddings=tf.constant([[13-int(tf.shape(x)[0]),0],[0,0]]),mode="CONSTANT"),y))
/usr/local/lib/python3.6/dist-packages/tensorflow/python/framework/constant_op.py:264 constant  **
    allow_broadcast=True)
/usr/local/lib/python3.6/dist-packages/tensorflow/python/framework/constant_op.py:282 _constant_impl
    allow_broadcast=allow_broadcast))
/usr/local/lib/python3.6/dist-packages/tensorflow/python/framework/tensor_util.py:456 make_tensor_proto
    _AssertCompatible(values, dtype)
/usr/local/lib/python3.6/dist-packages/tensorflow/python/framework/tensor_util.py:333 _AssertCompatible
    raise TypeError("Expected any non-tensor type, got a tensor instead.")

TypeError: Expected any non-tensor type, got a tensor instead.

Однако, когда я использую:

a=training_dataset.map(lambda x,y: (tf.pad(x,tf.constant([[1,0],[0,0]])),y))

Приведенный выше код работает нормально. Это подводит меня к выводу, что что-то не так с: 13-tf.shape(x)[0], но не могу понять, что именно. Я попытался преобразовать tf.shape(x)[0] в int(tf.shape(x)[0]), но все равно получил ту же ошибку.

Что я хочу, чтобы код делал: у меня есть объект tf.data.Dataset с последовательностями переменной длины размером (None,128), где первое измерение (None) меньше 13. Я хочу дополнить последовательности так, чтобы размер каждой коллекции был 13, т.е. (13,128). Есть ли альтернативный способ (если вышеуказанная проблема не может быть решена)?

1 Ответ

0 голосов
/ 06 августа 2020

Решение, которое работает:

с использованием:

paddings = tf.concat(([[13-tf.shape(x)[0],0]], [[0,0]]), axis=0)

вместо использования:

paddings = tf.constant([[13-tf.shape(x)[0],0],[0,0]])

работает для меня. Однако до сих пор не могу понять, почему последний не сработал.

...