来自生成器 OutOfRangeError 的 Tensorflow 数据集:序列结束

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

返回生成器的函数:

def img_x_gen(dir):
    files = glob.glob(f'{dir}/*.jpg')
    for file in files:
        X_i = np.asarray(Image.open(file))
        X_i = X_i / 255.0
        yield X_i, X_i  # It's an autoencoder so return X_i twice

创建数据集:

types = (tf.float32, tf.float32)
shapes = (img_shape, img_shape)
ds_train = tf.data.Dataset.from_generator(img_x_gen, types, shapes,
    args=['train/img_sq']).batch(batch_size)
ds_valid = tf.data.Dataset.from_generator(img_x_gen, types, shapes,
    args=['valid/img_sq'],).batch(batch_size)

调用拟合方法:

vae.fit(ds_train, epochs=3, validation_data=ds_valid, verbose=True) 

我得到问题标题中的错误:

OutOfRangeError:  End of sequence

训练集中的示例数量为 894,在验证集中为 247。

batch_size
为 32。如果我将数据加载到内存中,我知道该模型有效。

我也尝试制作一个生成器并手动批处理(并将

steps_per_epoch
validation_steps
传递给
model.fit
方法),但这会遇到类似的错误:
Your input ran out of data; interrupting training
.

很明显我对发电机一无所知。

python tensorflow keras generator
3个回答
2
投票

您可以直接将

model.fit_generator()
与生成器一起使用,而不是
model.fit()
。您收到此错误是因为您的生成器未根据输入的形状生成需要的值数量。您可以通过将其设为无限生成器来快速修复它。

def img_x_gen(dir):
    while True:
        # Make your generator infinite
        files = glob.glob(f'{dir}/*.jpg')
        for file in files:
            X_i = np.asarray(Image.open(file))
            X_i = X_i / 255.0
            yield X_i, X_i 

1
投票

因为你的数据集是迭代到最后的,所以使用.repeat()函数来重复你的数据集:

dataset = dataset.repeat()

0
投票

注意:无限生成器是正确的解决方案,但前提是

fit
函数也被修改了。在这种情况下,我们必须以这种方式声明 epoch 和每个 epoch 的步骤:

vae.fit(ds_train, epochs = 3, validation_data = ds_valid, verbose=True, steps_per_epoch = (len(files)//batch_size))

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