iPython notebook - 加载CIFAR - 10数据集时出现内存错误

时间:2016-02-16 15:29:16

标签: python-2.7 memory svm

我目前正在关注斯坦福大学的卷积神经网络课程: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! enter image description here

我尝试过只加载一个批次,但它确实有效,但我必须非常小心,不要弄乱任何步骤(不要两次运行相同的单元格,即使它似乎没有运行,...)。有人有解决方案吗?非常感谢你!

更新:在load_CIFAR_batch函数中,如果我注释掉重塑行:# X = X.reshape(10000, 3, 32, 32).transpose(0,2,3,1).astype("float") 然后该程序能够加载: enter image description here 所以也许我的程序无法运行的原因是因为重塑线,它会创建一个X和Y的副本,从而使数据加倍。这个假设是否正确,如果确实如此,我该怎么做呢?

2 个答案:

答案 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,那么它似乎压缩得很好:)

我认为你有两个(非相互)选项:

  1. 如果可能,请一次运行一批培训。你暗示你已经尝试过这个。

  2. 根据问题的类型,双精度(64位浮点数)可能超出您的需要。因此,您可以尝试将上面的行更改为float32而不是float。这将有效地将内存需求减少一半。 但是它可能会搞砸计算,除非你不小心。

  3. 购买更多内存或在其他计算机上运行。如果你进一步学习机器,那么<​​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...
相关问题