我目前正在关注斯坦福大学的卷积神经网络课程:http://cs231n.github.io/。我在带有2GB内存的Lenovo SL500上运行分配。但是当我使用以下代码加载Cifar-10数据集时:
import cPickle as pickle
import numpy as np
import os
from scipy.misc import imread
def load_CIFAR_batch(filename):
""" load single batch of cifar """
with open(filename, 'rb') as f:
datadict = pickle.load(f)
X = datadict['data']
Y = datadict['labels']
X = X.reshape(10000, 3, 32, 32).transpose(0,2,3,1).astype("float")
Y = np.array(Y)
return X, Y
def load_CIFAR10(ROOT):
""" load all of cifar """
xs = []
ys = []
for b in range(1,6):
f = os.path.join(ROOT, 'data_batch_%d' % (b, ))
X, Y = load_CIFAR_batch(f)
xs.append(X)
ys.append(Y)
Xtr = np.concatenate(xs)
Ytr = np.concatenate(ys)
del X, Y
Xte, Yte = load_CIFAR_batch(os.path.join(ROOT, 'test_batch'))
return Xtr, Ytr, Xte, Yte
实际上这是调用函数的部分:
# Load the raw CIFAR-10 data.
cifar10_dir = 'cs231n/datasets/cifar-10-batches-py'
X_train, y_train, X_test, y_test = load_CIFAR10(cifar10_dir)
# As a sanity check, we print out the size of the training and test data.
print 'Training data shape: ', X_train.shape
print 'Training labels shape: ', y_train.shape
print 'Test data shape: ', X_test.shape
print 'Test labels shape: ', y_test.shape
我收到此错误:
MemoryError Traceback (most recent call last)
<ipython-input-3-76ab1121c87e> in <module>()
1 # Load the raw CIFAR-10 data.
2 cifar10_dir = 'cs231n/datasets/cifar-10-batches-py'
----> 3 X_train, y_train, X_test, y_test = load_CIFAR10(cifar10_dir)
4
5 # As a sanity check, we print out the size of the training and test data.
C:\Users\son\assignment1\cs231n\data_utils.py in load_CIFAR10(ROOT)
20 for b in range(1,6):
21 f = os.path.join(ROOT, 'data_batch_%d' % (b, ))
---> 22 X, Y = load_CIFAR_batch(f)
23 xs.append(X)
24 ys.append(Y)
C:\Users\son\assignment1\cs231n\data_utils.py in load_CIFAR_batch(filename)
10 X = datadict['data']
11 Y = datadict['labels']
---> 12 X = X.reshape(10000, 3, 32, 32).transpose(0,2,3,1).astype("float")
13 Y = np.array(Y)
14 return X, Y
MemoryError:
事情是内存使用量迅速上升到2GB!即使CIFAR-10数据集只有大约177MB!
我尝试过只加载一个批次,但它确实有效,但我必须非常小心,不要弄乱任何步骤(不要两次运行相同的单元格,即使它似乎没有运行,...)。有人有解决方案吗?非常感谢你!
更新:在load_CIFAR_batch
函数中,如果我注释掉重塑行:# X = X.reshape(10000, 3, 32, 32).transpose(0,2,3,1).astype("float")
然后该程序能够加载:
所以也许我的程序无法运行的原因是因为重塑线,它会创建一个X和Y的副本,从而使数据加倍。这个假设是否正确,如果确实如此,我该怎么做呢?
答案 0 :(得分:1)
查看数据的大小,这一行
X = X.reshape(10000, 3, 32, 32).transpose(0,2,3,1).astype("float")
告诉我们每批数据都是10000*3*32*32
,这是一个超过3000万个浮点数。 float
数据类型实际上与float64
相同,这意味着每个数字8个字节。
这意味着每批产品至少占用240 MB。
您加载其中的6个(5个训练+ 1个测试),总共产生接近1.4 GB的数据。
如果数据集确实在磁盘上接近180 MB,那么它似乎压缩得很好:)
我认为你有两个(非相互)选项:
如果可能,请一次运行一批培训。你暗示你已经尝试过这个。
根据问题的类型,双精度(64位浮点数)可能超出您的需要。因此,您可以尝试将上面的行更改为float32
而不是float
。这将有效地将内存需求减少一半。
但是它可能会搞砸计算,除非你不小心。
购买更多内存或在其他计算机上运行。如果你进一步学习机器,那么<em> 会在某些时候成为你的问题。几乎任何标准都没有2GB,在机器学习领域几乎没有任何标准。
答案 1 :(得分:0)
我遇到了同样的问题。
我通过修改data_utils.py中的load_CIFAR10()
来减少数据集。
def load_CIFAR10(ROOT):
""" load all of cifar """
xs = []
ys = []
for b in range(1, 2):
# not to load all the data files, just 3 or less to test
f = os.path.join(ROOT, 'data_batch_%d' % (b, ))
X, Y = load_CIFAR_batch(f)
# other codes...