返回生成器的函数:
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
.
很明显我对发电机一无所知。
您可以直接将
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()
注意:无限生成器是正确的解决方案,但前提是
fit
函数也被修改了。在这种情况下,我们必须以这种方式声明 epoch 和每个 epoch 的步骤:
vae.fit(ds_train, epochs = 3, validation_data = ds_valid, verbose=True, steps_per_epoch = (len(files)//batch_size))