使用具有多个输出的生成器数据集的TensorFlow拟合:无法正确定义形状?



我正试图将一个项目转换为使用生成器具有多个输出的单个网络,但我似乎无法弄清楚如何在使用生成器时使多个输出正常运行。下面是一段最低限度可验证的代码:

import numpy as np
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers, models
def generate_sample():
x = list("123456789")
y = list("2345")
while 1:
yield np.array(x).astype(np.float32),[np.array(y).astype(np.float32),np.array(y).astype(np.float32)]
dataset = tf.data.Dataset.from_generator(generate_sample,
output_signature=(
tf.TensorSpec(shape=(9,), dtype=tf.float32),
tf.TensorSpec(shape=(2,4), dtype=tf.float32)
))
dataset = dataset.batch(batch_size=32)
inputs = keras.Input(shape=(next(generate_sample())[0].shape))
x = layers.Dense(512, activation = "relu")(inputs)
x_outputs = layers.Dense(4, activation="relu", name="output")(x)
y_outputs = layers.Dense(4, activation="relu", name="output2")(x)
model = keras.Model(inputs=inputs, outputs=[x_outputs,y_outputs])
model.compile(loss="mse", optimizer = "adam", metrics=['accuracy'])
history = model.fit(dataset, epochs=1, steps_per_epoch=10, validation_data=dataset, validation_steps=5)

这会导致一个很长的错误,它的最后一部分是:

InvalidArgumentError:不兼容的形状:[32,2,4]vs. [32,4]
[[node mean_squared_error/SquaredDifference(定义在: 1)]][Op: __inference_train_function_8957]

函数调用栈:train_function

我已经使用output_shape,output_signature等尝试了我可以想象重塑数据的每种方式。无论如何,我总是遇到形状问题。

我在这里错过了一些明显的东西,或者在fit中使用生成器作为数据集的源是否有问题?例如,当我从内存中加载数据时,我这样做没有问题。

模型的输出不是一个形状为(2,4)的张量,而是两个形状为(4)的张量。

你应该改变你的生成器函数来反映:

def generate_sample():
x = list("123456789")
y = list("2345")
while 1:
yield np.array(x).astype(np.float32),(np.array(y).astype(np.float32),np.array(y).astype(np.float32))

以及你的输出签名:

dataset = tf.data.Dataset.from_generator(generate_sample,
output_signature=(
tf.TensorSpec(shape=(9,), dtype=tf.float32),
(tf.TensorSpec(shape=(4,), dtype=tf.float32),
tf.TensorSpec(shape=(4,), dtype=tf.float32)),
))

注意生成器的输出是一个嵌套的元组。

相关内容

最新更新