当我尝试为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处理多个输入和输出?
谢谢您的帮助。
首先,似乎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))