使用numpy为CNN预处理图像数据集:内存错误

时间:2016-04-14 07:49:36

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

我有一个数据集(71094列车图像和17000测试)我需要训练CNN。在预处理期间,我尝试使用numpy创建一个矩阵,结果是非常大(71094 * 100 * 100 * 3 for火车数据)[所有图像都是RGB 100乘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)

1 个答案:

答案 0 :(得分:0)

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

根据您的目的,您可以使用多种方法来解决此问题。

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

2)小批量培训 - 将您的培训数据分成小的“小批量”,并分别对每个培训数据进行培训。在您完成所有迷你批次的培训并完成所有数据后,您的时代将结束。在这里,您应该每个时期随机化数据的顺序,以避免过度拟合。

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

我希望这很清楚..而且它有点帮助!