【问题标题】:When I try to save my numpy array to an .npy file I get a memory error. How can I create a large .npy file from image files with limited memory?当我尝试将我的 numpy 数组保存到 .npy 文件时,出现内存错误。如何从内存有限的图像文件创建大型 .npy 文件?
【发布时间】:2019-10-20 18:43:15
【问题描述】:

我是处理大型数据集的新手。我想用我的训练数据生成一个 .npy 文件。我有大约 1.7GB 的 PNG 图像要加载,但是由于内存错误,我已将此设置分成多个块,现在我尝试仅将大约 389.5 MB 的 PNG 文件加载到一个 numpy 数组中,然后保存它。我能够将文件加载到数组中,但是当我尝试保存它时出现内存错误。我已经尝试过 .pickle 和 .npy 文件类型。我很困惑为什么这是一个问题,因为我的笔记本电脑有 8GB 的​​ RAM。我可以看到我的代码中有一些内存效率低下,但我还没有找到解决它们的方法。如何将这些数据加载到 .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()

任何帮助将不胜感激!

【问题讨论】:

  • 没有真正深入研究您的代码...您是否检查过keras.preprocessing.image.ImageDataGenerator.flow_from_directory 是否可以解决您的问题?您真的需要保存您的训练数据还是可以即时生成?
  • 这是一个很好的建议,可以一起避免内存问题 - 尽管我使用了其他解决方案,因为我的代码结构似乎是现在的其他解决方案对我来说会更快。不过,下次我一定会记住这一点。谢谢

标签: python python-3.x numpy memory keras


【解决方案1】:

Pickle 和numpy.save 的内存效率太低,无法保存大型数据集,我建议您使用h5py 将数据保存为 HDF5,它非常高效,应该可以在这些限制下工作。

我用它来保存超过数百 GB 的图像数据集,并且 RAM 使用率很低。

【讨论】:

    猜你喜欢
    • 2020-10-22
    • 2021-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-30
    • 2019-09-15
    • 2019-09-10
    相关资源
    最近更新 更多