训练模型时出现内存错误:无法为形状为 (3094、720、1280、3) 且数据类型为 float32 的数组分配 31.9 GiB

Ali*_*ini 1 python machine-learning training-data tensorflow jupyter-notebook

因此,我根据人类的存在为我的图像提供了“0”和“1”的标签。当我传递所有图像并尝试训练我的模型时。我收到内存错误。

    import warnings
    warnings.filterwarnings('ignore')
    import tensorflow as to
    import tensorflow.keras
    from tensorflow.keras.preprocessing.image import ImageDataGenerator
    from tensorflow.keras.callbacks import ReduceLROnPlateau, CSVLogger, EarlyStopping
    from tensorflow.keras.models import Model
    from tensorflow.keras.layers import GlobalAveragePooling2D, Dense
    from tensorflow.keras.applications.resnet50 import ResNet50


    from PIL import Image
    import os
    import numpy as np
    train_x=[]
    train_y=[]
    for path in os.listdir('C:\\Users\\maini_\\Desktop\\TestAndTrain\\in\\train'):
        img = Image.open('C:\\Users\\maini_\\Desktop\\TestAndTrain\\in\\train\\'+path)
        train_x.append(np.array(img))
        train_y.append(1)
        img.close()
    for path in os.listdir('C:\\Users\\maini_\\Desktop\\TestAndTrain\\notin\\train'):
        img = Image.open('C:\\Users\\maini_\\Desktop\\TestAndTrain\\notin\\train\\'+path)
        train_x.append(np.array(img))
        train_y.append(0)
        img.close()
    print("done" )

   train_x = np.array(train_x)
   train_x = train_x.astype(np.float32)
   train_x /= 255.0

   train_y = np.array(train_y)
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

我正在与

  • Jupyter 笔记本版本:6.0.3
  • 蟒蛇版本:3.7
  • 蟒蛇版本:4.8.3

ZWa*_*ang 7

您已尝试将3094大小的图像720x1280作为单个批次传递到您的模型中,从而产生总共31.9GB的数据。您的 GPU 过载并且无法一次物理存储和处理所有数据,您需要使用批处理。

由于每次尝试处理数据时都会遇到麻烦,我建议使用ImageDataGenerator()flow_from_directory()它将自动加载图片以进行训练。

一种理想的设置方式如下

train_datagen = ImageDataGenerator(
    rescale=1./255,
    validation_split=0.3)   #Splits the data 70/30 for training and validation

train_generator = train_datagen.flow_from_directory(
        train_data_dir,
        color_mode='grayscale', 
        target_size=(img_width, img_height),
        batch_size=batch_size,
        class_mode='categorical',
        shuffle=True,
        subset='training')

validation_generator = train_datagen.flow_from_directory(
        train_data_dir,  
        color_mode='grayscale',
        target_size=(img_width, img_height),
        batch_size=batch_size,
        class_mode='categorical',
        shuffle=True,
        subset='validation')
Run Code Online (Sandbox Code Playgroud)

然后要适应模型,您需要调用model.fit_generator()该类

model.fit_generator(train_generator, epochs=epochs, callbacks=callbacks, validation_data=validation_generator)

这是在 Keras 中训练模型时处理大量图像的最佳方法,因为数据是从每个批次的目录中生成(或流动)的,而不是在 Python 中手动加载等等。唯一需要注意的是目录设置与您当前拥有的目录设置略有不同。您需要将目录设置更改为

TestAndTrain
 -Train
   -in
   -notin
 -Test
   -in
   -notin
Run Code Online (Sandbox Code Playgroud)