Происхождение новой ошибки памяти numpy и pickle?

#python #numpy #tensorflow #memory #pickle

#питон #тупой #тензорный поток #память #маринованный огурец

Вопрос:

Я сталкиваюсь с проблемой, когда хочу создать свой обучающий набор изображений для глубокого обучения. Изображения представляют собой файлы .tif в оттенках серого 299×299. Каждая категория содержит почти 3000 изображений. Раньше я компилировал эти данные в файле pickle, который составлял около 6.5 Go. Затем мне удалось загрузить его без каких-либо проблем.

Однако недавно я снова хочу поработать с этим обучающим набором, и когда я запустил точно такой же код, как раньше, у меня возникла эта ошибка памяти :

 import numpy as np
import os
import cv2
from tqdm import tqdm
import random
import pickle

DATADIR = "path/to/folder"
CATEGORIES = ["A", "B","C","D"]

training_data = []
IMG_SIZE_H = 299
IMG_SIZE_W = 299

def create_training_data():
    for category in CATEGORIES:
        
        path = os.path.join(DATADIR, category)
        class_num = CATEGORIES.index(category)
        

        list_dir = os.listdir(path)

        list_dir[:] = [item for item in list_dir if '.tif' in item]

        for img in tqdm(list_dir):
            try:
                img_array = cv2.imread(os.path.join(path, img), cv2.IMREAD_GRAYSCALE)
                new_array = cv2.resize(img_array, (IMG_SIZE_H, IMG_SIZE_W))
                training_data.append([new_array, class_num])
            except Exception as e:
                pass
            
create_training_data()

random.shuffle(training_data)

X = []
y = []

for features, label in training_data:
    X.append(features)
    y.append(label)
    
X = np.array(X).reshape(-1, IMG_SIZE_H, IMG_SIZE_W, 1)

X = X.reshape(X.shape[0], 299, 299, 1).astype('float32')

pickle_out = open("X_train.pickle", "wb")
pickle.dump(X, pickle_out, protocol=4)
pickle_out.close()

pickle_out = open("y_train.pickle", "wb")
pickle.dump(y, pickle_out)
pickle_out.close()
 

Трассировка ошибок памяти (последний последний вызов
) в
—-> 1 X = X.изменить форму (X.форма[0], 299, 299, 1). astype(‘float32’)

Ошибка памяти: невозможно выделить 6,06 гигабайт для массива с формой (18204, 299, 299, 1) и типом данных float32

Кроме того, я сохранил старый файл pickle (размером 6.5 Go), и когда я попытался загрузить его в том же самом CNN, что и ранее, у меня также возникла ошибка памяти :

 X_train = pickle.load(open('X_train.pickle', 'rb'))
 

Трассировка ошибок памяти (последний последний вызов
) в
—-> 1 X_train = pickle.загрузить (открыть (‘X_train.pickle’, ‘rb’))

Это очень странно, потому что я ничего не изменил, тот же компьютер, та же версия python (3.7), те же изображения, тот же код, те же версии для pickle и numpy (обновлен только tensorflow, но я не вижу никакой ссылки).

У меня такое чувство, что что-то идет не так с памятью самого моего компьютера, но я всегда использовал один и тот же компьютер для предыдущего кода.

Пожалуйста, не могли бы вы дать мне знать, если у вас есть какие-либо подсказки, которые могут объяснить или решить эту проблему!

Ответ №1:

A MemoryError — это исключение нехватки памяти.

Ошибка памяти: невозможно выделить 6,06 гигабайт для массива с формой (18204, 299, 299, 1) и типом данных float32

Можете ли вы проверить, есть ли у вас >7 gb доступная оперативная память?

Комментарии:

1. Привет, @JunkyByte ! Спасибо за ваш ответ. Как вы предположили, объем оперативной памяти был очень низким (по неизвестным причинам). После перезагрузки компьютера код работает нормально (всегда помните основы отладки ^^)