让我们从一个包含1000个图像的文件夹开始。
现在,如果我们不使用生成器,batch_size = 10和steps_per_epoch = 100,我们将使用每幅图片作为10 * 100 = 1000。因此,增加steps_per_epoche将(正确地)导致错误:
tensorflow:您的输入没有数据;中断培训。确保数据集或生成器至少可以生成
steps_per_epoch * epochs批(在本例中为10000批)
另一方面,使用生成器将导致无休止的图像批次:
datagenerator = ImageDataGenerator(
rescale=1./255,
shear_range=0.1,
zoom_range=0.1,
# ...
)
imageFlow = datagenerator.flow_from_directory(
image_dir_with_1000_pcs,
target_size=(150, 150),
batch_size=10,
class_mode='binary')
i = 0
for x, y in imageFlow:
print(x.shape) # batch of images
i += 1
if i > 3000:
break # I break, because it ENDLESSLY goes on otherwise但是,如果我去跑步
history = model.fit(
imageFlow,
steps_per_epoch=101, # I increased this above 100!
epochs=5,
#...
)我也会得到同样的错误:为什么?model.fit()会得到一个生成器,因此会得到无穷无尽的批。如果有无休止的批次,它怎么会耗尽数据呢?
在发表这个问题之前,我读到:
发布于 2021-05-19 13:27:46
生成器(ImageDataGenerator)如何耗尽数据?
据我所知,它从生成器中创建了一个tf.data.Dataset,它不会无限地运行,这就是为什么您在拟合时会看到这种行为。
如果它是一个无限数据集,那么必须指定steps_per_epoch。
编辑:如果您不指定steps_per_epoch,那么培训将在number_of_batches >= len(dataset) // batch_size时停止。在每一个时代都是这样的。
为了检查引擎盖下到底发生了什么,您可以检查来源。可以看到,创建了一个tf.data.Dataset,它实际上处理批处理和划时代迭代。
https://stackoverflow.com/questions/67603949
复制相似问题