Когда я пытаюсь сохранить массив numpy в файл .npy, у меня возникает ошибка памяти. Как я могу создать большой файл .npy из файлов изображений с ограниченной памятью? - PullRequest
2 голосов
/ 05 июня 2019

Я новичок в работе с большими наборами данных.Я хотел бы создать файл .npy с моими данными обучения.У меня есть PNG-изображения объемом около 1,7 ГБ, которые я хочу загрузить, однако из-за ошибок памяти я разделил этот набор на куски, и сейчас я пытаюсь загрузить PNG-файлы только около 389,5 МБ в массивный массив и затем сохранить их.Это.Я могу загрузить файлы в массив, но когда я пытаюсь сохранить его, я получаю ошибку памяти.Я пробовал оба типа файлов .pickle и .npy.Я не понимаю, почему это проблема, поскольку у моего ноутбука 8 ГБ ОЗУ.Я вижу, что в моем коде есть некоторые недостатки памяти, но я не нашел способа их обойти.Как я могу загрузить эти данные в файл .npy?И каков наилучший подход для меня, чтобы я также включил остальные данные о моих тренировках?

def create_training_data():
    training_data = []
    IMAGE_SIZE = 640
    DATADIR = os.path.join(os.path.dirname(__file__), 'training_data')  # directory where training data is held
    CATEGORIES = ["0", "1"]
    count = 0
    fail = 0
    for category in CATEGORIES:

        path = os.path.join(DATADIR, category)
        class_num = CATEGORIES.index(category)
        for img in os.listdir(path):#
            count += 1
            print(str(count))
            try:

                img_array = cv2.imread(os.path.join(path, img))
                if not (img_array.shape[0] == IMAGE_SIZE and img_array.shape[1] == IMAGE_SIZE):
                    img_array = cv2.resize(img_array, (IMAGE_SIZE, IMAGE_SIZE))

                training_data.append([img_array, class_num])

            except Exception:

                fail += 1
                print("failed "+str(fail)+"/"+str(count))

    random.shuffle(training_data)
    X = []
    y = []

    for features, label in training_data:

        X.append(features)
        print(str(features))
        y.append(label)
    # X = np.array(X).reshape(-1, IMAGE_SIZE, IMAGE_SIZE, 3)
    np.save('training_data/X.npy', X)
    np.save('training_data/y.npy', y)
    # pickle_out = open("training_data/X.pickle", "wb")
    # pickle.dump(X, pickle_out)
    # pickle_out.close()pytho
    # pickle_out = open("training_data/y.pickle", "wb")
    # pickle.dump(y, pickle_out)
    # pickle_out.close()

Любая помощь будет высоко ценится!

1 Ответ

1 голос
/ 05 июня 2019

Pickle и numpy.save слишком неэффективны для сохранения больших наборов данных. Я бы порекомендовал вам использовать h5py для сохранения данных в формате HDF5, что очень эффективно и должно работать при этих ограничениях.

Я использовал его для сохранения наборов данных изображений на сотнях ГБ при низкой загрузке ОЗУ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...