Ошибка памяти при обучении моей модели: невозможно выделить 31,9 ГБ для массива с формой (3094, 720, 1280, 3) и типом данных float32

Итак, я присваиваю своим изображениям метки 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)

введите здесь описание изображения

я работаю с

  • версия блокнота Jupyter: 6.0.3
  • версия питона: 3.7
  • Версия Анаконды: 4.8.3

person Alisha Maini    schedule 20.07.2020    source источник
comment
В дополнение к другому ответу вы можете попробовать обрезать/изменить размер изображений. Вы в основном пытаетесь загрузить все эти изображения в память, и, к сожалению, у вас недостаточно оперативной памяти для этого. Поэтому используйте партии или обрезайте их до меньшего размера.   -  person Deepak    schedule 20.07.2020


Ответы (1)


Вы пытались передать 3094 изображения размера 720x1280 в свою модель как один единственный пакет, в результате чего общий объем данных составил 31,9 ГБ. Ваш графический процессор перегружен и физически не может хранить и обрабатывать все эти данные одновременно, вам нужно использовать пакеты.

Так как вы будете сталкиваться с проблемами каждый раз, когда будете пытаться обработать данные, я рекомендую использовать 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')

Затем, чтобы соответствовать модели, вам нужно будет вызвать класс 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
person ZWang    schedule 20.07.2020
comment
В идеале это должен быть комментарий, показать ОП, как это можно сделать. Тогда я проголосую за ваш ответ. - person Roshin Raphel; 20.07.2020