【问题标题】:Why does Keras ImageDataGenerator throwing Memory Error?为什么 Keras ImageDataGenerator 会抛出内存错误?
【发布时间】:2019-11-28 01:38:15
【问题描述】:

我正在 Keras 中构建一个简单的“猫对狗分类器”。在安装ImageDataGenerator 时,我得到了MemoryError。我的代码如下所示:

from keras.preprocessing.image import ImageDataGenerator

image_gen = ImageDataGenerator(shear_range=0.2,
    zoom_range=0.2,
    horizontal_flip=True) 

image_gen.fit(X)

X 的形状为(25000,150,150,3)

我做错了什么或如何解决这个问题?

我已经检查了thisthis

---------------------------------------------------------------------------
MemoryError                               Traceback (most recent call last)
<ipython-input-10-2fd88662a693> in <module>
----> 1 image_gen.fit(X)

/opt/conda/lib/python3.6/site-packages/keras_preprocessing/image/image_data_generator.py in fit(self, x, augment, rounds, seed)
    943             np.random.seed(seed)
    944 
--> 945         x = np.copy(x)
    946         if augment:
    947             ax = np.zeros(

/opt/conda/lib/python3.6/site-packages/numpy/lib/function_base.py in copy(a, order)
    790 
    791     """
--> 792     return array(a, order=order, copy=True)
    793 
    794 # Basic operations

MemoryError: 

【问题讨论】:

    标签: python tensorflow keras


    【解决方案1】:

    您正在生成器中使用数据增强,这实际上使您拥有的图像数量增加了三倍。很可能您的计算机无法处理内存中的 75k 图像(由于 RAM 低,尤其是 GPU RAM)。您的选择是减小图像大小、减少增强,或者让数据生成器从文件夹中读取图像而不将它们存储在内存中(批量)。

    如图here 所示:

    train_datagen = ImageDataGenerator(shear_range=0.2,
                                       zoom_range=0.2,
                                       horizontal_flip=True)
    
    test_datagen = ImageDataGenerator(rescale=1./255)
    
    train_generator = train_datagen.flow_from_directory(
            'data/train',
            target_size=(150, 150),
            batch_size=32,
            class_mode='binary')
    
    validation_generator = test_datagen.flow_from_directory(
            'data/validation',
            target_size=(150, 150),
            batch_size=32,
            class_mode='binary')
    
    # Change to match your problem
    model.fit_generator(
            train_generator,
            steps_per_epoch=2000,
            epochs=50,
            validation_data=validation_generator,
            validation_steps=800)
    

    【讨论】:

    • 据我了解flow_from_directory() 要求数据位于按类别划分的单独文件夹中。当不同类的数据在同一个文件夹中时,这是否也有效?
    • @mmrbulbul 它将起作用,但会将它们视为同一类,因此您的结果会很差。使用flow_from_directory() 确实需要更多的数据预处理,但如果您不想遇到与内存相关的问题,这是值得的。
    • 那我最好先把数据分开,用flow_from_directory() 。谢谢@Ibragile
    • @mmrbulbul 没错,如果您觉得有用,请考虑通过单击“复选标记”来接受我的回答。
    猜你喜欢
    • 2018-09-02
    • 2020-12-22
    • 2017-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-10
    • 2019-06-13
    相关资源
    最近更新 更多