如何在tf.data.Dataset中输入不同大小的列表列表

Esc*_*tor 17 python tensorflow tensorflow-datasets

我有一长串的整数列表(代表每个不同大小的句子)我想用tf.data库提供.每个列表(列表列表)都有不同的长度,我得到一个错误,我可以在这里重现:

t = [[4,2], [3,4,5]]
dataset = tf.data.Dataset.from_tensor_slices(t)
Run Code Online (Sandbox Code Playgroud)

我得到的错误是:

ValueError: Argument must be a dense tensor: [[4, 2], [3, 4, 5]] - got shape [2], but wanted [2, 2].
Run Code Online (Sandbox Code Playgroud)

有没有办法做到这一点?

编辑1:为了清楚,我不想填写列表的输入列表(它是包含超过一百万个元素的句子列表,具有不同的长度)我想使用tf.data库来提供,在一个正确的方式,一个不同长度的列表列表.

mrr*_*rry 13

您可以使用tf.data.Dataset.from_generator()将任何可迭代的Python对象(如列表列表)转换为Dataset:

t = [[4, 2], [3, 4, 5]]

dataset = tf.data.Dataset.from_generator(lambda: t, tf.int32, output_shapes=[None])

iterator = dataset.make_one_shot_iterator()
next_element = iterator.get_next()

with tf.Session() as sess:
  print(sess.run(next_element))  # ==> '[4, 2]'
  print(sess.run(next_element))  # ==> '[3, 4, 5]'
Run Code Online (Sandbox Code Playgroud)


Fla*_*hDD 7

对于那些使用 TensorFlow 2 并寻找答案的人,我发现以下内容可以直接使用参差不齐的张量。只要整个数据集适合内存,它应该比生成器快得多。

t = [[[4,2]],
     [[3,4,5]]]

rt=tf.ragged.constant(t)
dataset = tf.data.Dataset.from_tensor_slices(rt)

for x in dataset:
  print(x)
Run Code Online (Sandbox Code Playgroud)

产生

<tf.RaggedTensor [[4, 2]]>
<tf.RaggedTensor [[3, 4, 5]]>
Run Code Online (Sandbox Code Playgroud)

出于某种原因,在单个数组上至少有 2 个维度是非常特别的。

  • +1 但仅供参考,tf 2.1 不再需要额外的括号 (2认同)