tensorflow - 带有生成器的 tf.data api 的多个输入
问题描述
当我尝试为 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'
简单地切换到生成数组元组的生成器似乎可以解决这个错误。
接下来,根据文档,您应该提供与生成器产生的元素的每个组件相对应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))
推荐阅读
- google-chrome-extension - 带有 chrome 扩展程序的 Keycloak 登录 #2
- node.js - OAuth 1.0a 每 4 次失败一次
- javascript - 解析器继承不显示参数 typegraphql
- javascript - 如何为有评论的帖子构建 React 上下文
- filter - 如何增加片段着色器中像素之间的空间?
- deep-learning - pytorch 自定义数据集生成器中的“索引 1 超出尺寸 1 的维度 0”错误
- java - 在 Web servlet 应用程序中使用二进制数据初始化数据库
- outlook - Outlook 加载项 displayDialogAsync 在浏览器客户端中工作,而不是在完整客户端中
- python - 在饼图中的标题中添加 N
- python - 如何将新列分配给熊猫中的现有DataFrame