我正在构建一个神经网络。我无法一次将所有训练数据加载到内存中,因此我使用 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.
我使用字典而不是列表解决了这个问题。
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)]
此调整可确保生成器中的密钥与模型在输入处预期的密钥相匹配。