TensorFlow 不接受数据集生成器的列表类型

问题描述 投票:0回答:1

我正在构建一个神经网络。我无法一次将所有训练数据加载到内存中,因此我使用 TensorFlow 的 tf.data.Dataset.from_generator 函数增量加载数据。但是,它会抛出一个错误,表示它不接受张量列表作为类型。

TypeError: `output_signature` must contain objects that are subclass of 
`tf.TypeSpec` but found <class 'list'> which is not.

我的神经网络的输入是 151 个独立张量的列表。我如何在生成器中表示这一点?我的代码如下:

def generator(file_paths, batch_size, files_per_batch, tam, value):
    return tf.data.Dataset.from_generator(
        lambda: data_generator(file_paths, batch_size, files_per_batch, tam, value),
        output_signature=(
            [tf.TensorSpec(shape=(batch_size, tam), dtype=tf.float32) for _ in range(tam+1)],  # Lista de 151 tensores
            tf.TensorSpec(shape=(batch_size, tam), dtype=tf.float32)  # Rótulos
        )
    )

inputArray = [Input(shape=(tam,)) for _ in range(tam + 1)]

train_dataset = generator(file_paths, batch_size, files_per_batch, tam, False)
train_dataset = train_dataset.prefetch(tf.data.AUTOTUNE)

model.fit(train_dataset, epochs=1000, validation_split=0.2, verbose=1)

我尝试使用 tf.data.Dataset.from_generator 将数据批量输入我的神经网络,因为我无法一次将所有数据加载到内存中。 然而,我遇到了一个错误:

TypeError: output_signature must contain objects that are subclass of tf.TypeSpec but found <class 'list'> which is not.
python tensorflow machine-learning keras tf.data.dataset
1个回答
0
投票

我使用字典而不是列表解决了这个问题。

def 生成器(文件路径、批次大小、每批次文件、大小、值): 返回 tf.data.Dataset.from_generator( lambda:data_generator(文件路径,batch_size,files_per_batch,大小,值), 输出签名=( {f"input_{i}": tf.TensorSpec(shape=(batch_size, size), dtype=tf.float32) for i in range(size + 1)}, # 输入 tf.TensorSpec(shape=(batch_size, size), dtype=tf.float32) # 标签 ) )

为了实现这一点,我将输入层调整为:

inputArray = [输入(形状=(size,), name=f"input_{i}") for i in range(size + 1)]

此调整可确保生成器中的密钥与模型在输入处预期的密钥相匹配。

© www.soinside.com 2019 - 2024. All rights reserved.