Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/348.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 生成器(ImageDataGenerator)如何耗尽数据?_Python_Tensorflow_Keras - Fatal编程技术网

Python 生成器(ImageDataGenerator)如何耗尽数据?

Python 生成器(ImageDataGenerator)如何耗尽数据?,python,tensorflow,keras,Python,Tensorflow,Keras,让我们从一个包含1000个图像的文件夹开始 现在,如果我们不使用生成器,并且batch\u size=10和steps\u per\u epoch=100我们将使用每个图片作为10*100=1000。因此,增加每个记录的步数将(正确地)导致错误: tensorflow:您的输入用完了数据;中断训练。确保您的数据集或生成器至少可以生成steps\u per\u epoch*epoch批(在本例中为10000批) 另一方面,使用生成器将导致无休止的图像批次: datagenerator=ImageD

让我们从一个包含1000个图像的文件夹开始

现在,如果我们不使用生成器,并且
batch\u size=10
steps\u per\u epoch=100
我们将使用每个图片作为10*100=1000。因此,增加每个记录的
步数将(正确地)导致错误:

tensorflow:您的输入用完了数据;中断训练。确保您的数据集或生成器至少可以生成
steps\u per\u epoch*epoch
批(在本例中为10000批)

另一方面,使用生成器将导致无休止的图像批次:

datagenerator=ImageDataGenerator(
重新缩放=1./255,
剪切范围=0.1,
缩放范围=0.1,
# ...
)
imageFlow=来自目录的datagenerator.flow\u(
带有1000台PC的图像目录,
目标_大小=(150150),
批次尺寸=10,
class_mode='binary')
i=0
对于imageFlow中的x,y:
打印(x.shape)#一批图像
i+=1
如果i>3000:
中断——我中断了,因为它会无休止地继续下去
但是,如果我去跑步

history=model.fit(
imageFlow,
每纪元步数=101,#我将其增加到100以上!
纪元=5,
#...
)
我会得到同样的错误:为什么
model.fit()
获取一个生成器,从而获得无止境的批处理。当被无休止的批量输入时,它怎么会耗尽数据

在发布此问题之前,我读到:

  • 文档,如和
  • 相对的,像这样的问题
生成器(ImageDataGenerator)如何耗尽数据

据我所知,它从生成器中创建了一个
tf.data.Dataset
,它不会无限运行,这就是为什么在拟合时会看到这种行为

如果它是一个无限数据集,那么您必须指定
每个历元的步骤

编辑:如果未指定每个历元的
步骤
,则当
批次数>=len(数据集)//批次大小
时,培训将停止。每一个时代都是这样


为了检查引擎盖下到底发生了什么,你可以检查。可以看到,创建了一个
tf.data.Dataset
,它实际上处理批处理和历元迭代。

但在的文档中指出,“我们需要手动打破循环,因为[…]生成器无限期地循环”。顺便说一句,获取tf.data.Dataset本身就是一项任务——请看:是的,这就是生成器在tf中的工作方式
model.fit()
实际处理终止过程。如果你想创建一个手动训练过程,那么你必须处理历元结束等。我的意思是,在引擎盖下,它返回一个tf.data.DatasetOk,对我来说,一个模型在每个步骤中都要求批量数据。生产商可以无休止地交付批次。而且模型在纪元结束之前仍然会耗尽数据。为什么?没有
len(图像流)
。就这样一直持续下去。model.fit()上的文档甚至声明“当传递一个无限重复的数据集时,您必须指定每个历元的步长参数。”。我真的很抱歉,但我无法跟踪生成器零件的长度。发电机产量,直到积极使用中断,怎么可能有一个长度?你能不能这么客气,可以换一种措辞?我真的很想弄清楚。很抱歉我删除了它,编辑了答案。现在清楚了吗?我们还期待着数据不断增加。我猜实现更改为
Dataset
。你找到解决办法了吗?我一直在寻找数据扩充的循环。对不起,我在这里帮不了你,因为我只是在寻找一个我没有预料到的行为的解释。但我认为您不需要解决这个问题,因为对于每个epoche,您都会得到不同的增强数据。因此,无尽的epoches==无限的扩充数据,如果您愿意,或者?否则,可以预先准备批次,这是一个简单的解决方法。