2016-04-14 37 views
0

我有一个数据集(71094火车图像和17000测试),我需要训练一个CNN。在预处理过程中,我尝试使用numpy创建一个矩阵,结果是荒谬的大(火车数据为71094 * 100 * 100 * 3)[所有图像都是RGB 100乘100]。因此,我收到了一个内存错误。我该如何解决这个问题。请帮忙。 这是我的代码..预处理CNN的numpy图像数据集:内存错误

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) 

回答

0

我最近遇到了同样的问题,并与图像数据时,我相信它是一个常见的问题。

根据您想要做的事情,您可以使用多种方法来解决此问题。

1)训练时从每幅图像中采样数据是有意义的,所以不要在所有71094 * 100 * 100像素上训练。这可以简单地通过创建一次加载一个图像的函数并对像素进行采样来完成。有一种观点认为,对每个时期随机做这件事可以减少过度拟合,但也取决于确切的问题。如果您正在使用像素分类,分层采样也可能有助于平衡类别。 2)小批量培训 - 将您的培训数据分成小的“小批量”并分别进行培训。您的时代将在您完成所有小批量的培训并包含所有数据后结束。在这里,您应该在每个时代对数据的顺序进行随机排列,以避免过度拟合。

3)一次加载和训练一个图像 - 类似于小批量训练,但是每次迭代只使用一个图像作为“小批量”,然后运行for循环遍历所有图像文件夹。这种方式一次只能将1x100x100x3存储在内存中。取决于你的内存大小,你可能可以使用多个图像每个小批量,即 - Nx100x100x3,并运行71094/N迭代遍历所有训练数据

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