Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/366.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用numpy为CNN预处理图像数据集:内存错误_Python_Numpy_Neural Network_Conv Neural Network - Fatal编程技术网

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

Python 使用numpy为CNN预处理图像数据集:内存错误,python,numpy,neural-network,conv-neural-network,Python,Numpy,Neural Network,Conv Neural Network,我有一个数据集(71094个火车图像和17000个测试),我需要为它训练一个CNN。在预处理期间,我尝试使用numpy创建一个矩阵,结果大得离谱(火车数据为71094*100*100*3)[所有图像都是RGB 100 x 100]。。因此,我得到了一个记忆错误。我如何处理这种情况。?请帮助。 这是我的密码 import numpy as np import cv2 from matplotlib import pyplot as plt data_dir = './fashion-data/

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

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

根据您想做什么,您可以使用多种方法来解决此问题

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

2) 小批量培训-将您的培训数据拆分为小“小批量”,并分别进行培训。当您使用所有数据完成所有小批量的培训后,您的历元将结束。在这里,您应该在每个历元中随机化数据的顺序,以避免过度拟合

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

我希望这是清楚的。。这对我有点帮助