【问题标题】:Why does my python freeze when I use zip()?为什么当我使用 zip() 时我的 python 会冻结?
【发布时间】:2019-10-01 23:24:27
【问题描述】:

我正在使用带有 tensorflow 后端的 Keras。我需要从目录中提取一堆图像,包括输入和输出,并使用它们来拟合模型。我正在使用 Keras 库中的 ImageDataGenerator.flow_from_directory() 函数创建两个生成器,一个用于提取输入文件,一个用于提取输出文件。

Keras 的 model.fit_generator() 函数只需要一个生成器,所以我使用 zip(generator_1, generator_2) 将它合并到一个生成器中。但是,这导致我的程序冻结并且永远无法完成。

def fit_model(self, batch_size, epochs, initial_epoch, callbacks):
    short_generator = self.train_datagen.flow_from_directory('../screenshots/short', class_mode=None, target_size=(self.x_res,self.y_res))
    long_generator = self.train_datagen.flow_from_directory('../screenshots/long', class_mode=None, target_size=(self.x_res,self.y_res))
    print('zipping generators')
    generator = zip(short_generator, long_generator)
    print('done zipping generators')
    self.model.fit_generator(generator, steps_per_epoch=math.ceil(1190/self.batch_size), epochs=10)
    self.model.save('./weights/finished.h5')

这会导致打印“压缩生成器”,但从未“完成压缩生成器”

【问题讨论】:

  • 你使用的是 Python 2.X 吗?
  • @SergeiLebedev 是的,我发布了这个问题是因为这个问题困扰了我几个小时,我想为其他陷入困境的人解释一下。我不确定是否有更简单的方法来回答我自己的问题,如果我搞砸了,很抱歉。不过谢谢!

标签: python-3.x python-2.7 tensorflow keras generator


【解决方案1】:

我解决了这个问题,并想向其他人解释如何:

我不知道这是否总是正确的,但对我来说,zip() 是冻结的,因为它是在 Python 2.7 中运行的。在 Python 3.x 中,它实际上在一两秒内运行。我没有卸载 Python 2,但我通过以下方式下载了我需要的所有 Python 3 表单中的依赖项:

python3 -m pip install tensorflow-gpu, keras, numpy, etc...

然后我调用了脚本

python3 myscript.py

代替

python myscript.py

而且效果很好。

【讨论】:

  • ...这是因为在 Python 2 中,zip 不是生成器。它将所有生成的数据放入内存中,这可能需要很长时间
【解决方案2】:

您可以通过将 zip 替换为 itertools.izip 来解决您的问题,而无需切换到 3.X。

Python 2.X 中的zip 急切并返回一个列表,而itertools.izip(在 Python 3.X 中变为 zip)产生一个惰性序列。

【讨论】:

  • 有趣的是,我仍然很困惑 zip 返回列表会冻结我的功能。第二个打印语句永远不会被调用,所以它显然永远不会完成。列表是否太大?每个生成器只有 1300 张图像。
  • 一般来说,zip 应该确实返回了一个列表,或者以 MemoryError 失败。确切的答案取决于flow_from_directory 的实现细节。例如。它可以产生一个循环或重复的数据集(这对于训练来说是正常的)。
猜你喜欢
  • 1970-01-01
  • 2020-01-03
  • 2020-01-12
  • 2017-04-26
  • 1970-01-01
  • 2011-01-21
  • 2013-10-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多