Tensorflow dataset from generator OutOfRangeError: End of sequence

Tensorflow dataset from generator OutOfRangeError: End of sequence

returns 生成器的函数:

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_epochvalidation_steps 传递给 model.fit 方法),但是遇到了类似的错误:Your input ran out of data; interrupting training.

很明显我对发电机有些不了解。

您可以直接将 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 

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

dataset = dataset.repeat()