【问题标题】:Preprocessing Image dataset with numpy for CNN:Memory Error使用 numpy 为 CNN 预处理图像数据集:内存错误
【发布时间】:2016-08-05 15:17:41
【问题描述】:

我有一个数据集(71094 个训练图像和 17000 个测试),我需要为它训练一个 CNN。在预处理期间,我尝试使用 numpy 创建一个矩阵,结果证明这个矩阵非常大(71094*100*100*3 for火车数据)[所有图像都是 RGB 100 x 100]..因此我得到一个内存错误。我该如何解决这种情况.??请帮忙。 这是我的代码..

import numpy as np
import cv2
from matplotlib import pyplot as plt


data_dir = './fashion-data/images/'
train_data = './fashion-data/train.txt'
test_data = './fashion-data/test.txt'


f = open(train_data, 'r').read()
ims = f.split('\n')
print len(ims)

train = np.zeros((71094, 100, 100, 3)) #this line causes the error..

for ix in range(train.shape[0]):
    i = cv2.imread(data_dir + ims[ix] + '.jpg')
    label = ims[ix].split('/')[0]

    train[ix, :, :, :] = cv2.resize(i, (100, 100))

print train[0]


train_labels = np.zeros((71094, 1))
for ix in range(train_labels.shape[0]):
    l = ims[ix].split('/')[0]
    train_labels[ix] = int(l)
print train_labels[0]

np.save('./data/train', train)
np.save('./data/train_labels', train_labels)

【问题讨论】:

    标签: python numpy neural-network conv-neural-network


    【解决方案1】:

    我最近遇到了同样的问题,我认为这是处理图像数据时的常见问题。

    您可以使用多种方法来解决此问题,具体取决于您想要做什么。

    1) 在训练时从每张图像中采样数据是有意义的,因此不要在所有 71094*100*100 像素上进行训练。这可以通过创建一个一次加载一个图像并采样像素的函数来简单地完成。有一些论点认为,对每个 epoch 随机执行此操作可以减少过度拟合,但这又取决于确切的问题。如果您使用像素分类,分层抽样也可能有助于平衡类。

    2) 小批量训练 - 将您的训练数据拆分为小的“小批量”,并分别对其中的每一个进行训练。在您完成所有小批量以及所有数据的训练后,您的 epoch 将结束。在这里,您应该在每个时期随机化数据的顺序以避免过度拟合。

    3) 一次加载和训练一张图像 - 类似于小批量训练,但每次迭代只需使用一张图像作为“小批量”,并在所有图像中运行 for 循环文件夹。这样一次只有 1x100x100x3 存储在内存中。根据您的内存大小,您可能会在每个小批量中使用多个图像,即 - Nx100x100x3,并运行 71094/N 次迭代以检查所有训练数据

    我希望这很清楚......并且它会有所帮助!

    【讨论】:

      猜你喜欢
      • 2020-09-10
      • 1970-01-01
      • 1970-01-01
      • 2022-06-16
      • 2020-07-21
      • 1970-01-01
      • 2021-06-01
      • 2022-01-18
      • 1970-01-01
      相关资源
      最近更新 更多