【问题标题】:Multiple input for tf.data api with generators带有生成器的 tf.data api 的多个输入
【发布时间】:2020-02-13 10:56:46
【问题描述】:

当我尝试为 LSTM 提供多个输入时,我在使用 tf.data.dataset API 时遇到了一些困难,也就是说,每个特征都有一个长度为 n 的向量(时间序列中的步骤),让我们一天, 5个特点。因此,我有一个长度为 5 个向量的列表,让我们说,n = 3。

例如,我有一个生成器,它在每一步都产生具有以下结构的数据:

      [
       array( 
        [
         [5.00000000e-01, 5.00000000e-01, 5.00000000e-01],
         [9.00000000e+00, 9.00000000e+00, 9.00000000e+00],
         [7.00000000e+00, 9.00000000e+00, 1.00000000e+01],
         [6.30841636e-03, 4.22776321e-02, 1.49106372e-02],
         [4.00000000e+00, 1.00000000e+01, 2.20000000e+01]
        ]), 
       array(
        [
         [ 9,  9,  9],
         [13, 13, 13]
        ]
       )
      ]

当我尝试使用代码行将其放入 api 时:

tf.data.Dataset.from_generator(
            generator=lambda: generator,
            output_types=(
                (
                    (tf.float32, tf.float32, tf.float32),
                    (tf.int32, tf.int32, tf.int32),
                    (tf.int32, tf.int32, tf.int32),
                    (tf.float32, tf.float32, tf.float32),
                    (tf.int32, tf.int32, tf.int32)
                ),
                (
                    (tf.int32, tf.int32, tf.int32),
                    (tf.int32, tf.int32, tf.int32)
                )
            )
        )

我得到错误:

TypeError: generator 产生的元素与预期结构不匹配。预期的结构是 .... 但产生的元素是 ... 。

我错过了什么?如何编写正确的 output_shape?或者不可能给 tf.data 的生成器一个嵌套结构?如何使用 tf.data.dataset.from_generator 处理多个输入和输出?

提前感谢您的帮助。

【问题讨论】:

    标签: tensorflow keras generator lstm tensorflow-datasets


    【解决方案1】:

    首先,from_generator 似乎无法处理生成数组列表的生成器,因为这会导致以下异常:

    TypeError: unhashable type: 'list'
    

    简单地切换到生成数组元组的生成器似乎可以解决这个错误。

    接下来,根据the documentation,作为output_types,您应该提供tf.DType对象的嵌套结构,对应于生成器产生的元素的每个组件。

    在这种情况下,您的生成器生成的元素是两个数组的元组。因此,您应该提供与每个组件/数组对应的 tf.DType 对象的嵌套结构。或者换句话说,作为output_types,您应该提供一个包含两个tf.DType 对象的元组,指示每个数组的所需类型(而不是试图指示每个数组中每个值的所需类型)。

    下面的代码可以让你了解如何正确使用from_generator

    import numpy as np
    import tensorflow as tf
    
    
    def generator():
        for _ in range(10):
            yield (np.random.rand(5, 3), np.random.rand(2, 3))
    
    
    dataset = tf.data.Dataset.from_generator(generator,
                                             output_types=(tf.float32, tf.float32))
    
    

    【讨论】:

      猜你喜欢
      • 2019-03-06
      • 1970-01-01
      • 2019-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-01
      • 2020-07-16
      • 2020-10-28
      相关资源
      最近更新 更多