【问题标题】:Python (numpy) crashes system with large number of array elementsPython(numpy)使用大量数组元素使系统崩溃
【发布时间】:2017-07-18 21:47:39
【问题描述】:

我正在尝试使用 scikit 提供的许多分类器来构建一个基本的字符识别模型。使用的数据集是一组标准的手写字母数字样本(Chars74K 图像数据集取自 source:EnglishHnd.tgz)。

每个字符有 55 个样本(总共 62 个字母数字字符),每个样本大小为 900x1200 像素。我正在将矩阵(首先转换为灰度)展平为 1x1080000 数组(每个数组代表一个特征)。

for sample in sample_images: # sample images is the list of the .png files
    img = imread(sample);
    img_gray = rgb2gray(img);
    if n == 0 and m == 0: # n and m are global variables
        n, m = np.shape(img_gray);
    img_gray = np.reshape(img_gray, n*m);
    img_gray = np.append(img_gray, sample_id); # sample id stores the label of the training sample
    if len(samples) == 0: # samples is the final numpy ndarray
        samples = np.append(samples, img_gray);
        samples = np.reshape(samples, [1, n*m + 1]);
    else:
        samples = np.append(samples, [img_gray], axis=0);

所以最终的数据结构应该有 55x62 的数组,其中每个数组的容量为 1080000 个元素。只有最终的结构被存储(中间矩阵的范围是本地的)。

为学习模型而存储的数据量非常大(我猜),因为程序并没有真正超出某个点,并且使我的系统崩溃到必须修复 BIOS 的程度!

到目前为止,程序只是收集要发送给分类器的数据……分类甚至还没有被引入到代码中。

关于如何更有效地处理数据有什么建议吗?

注意:我使用 numpy 来存储展平矩阵的最终结构。 此外,该系统具有 8Gb RAM。

【问题讨论】:

    标签: python arrays numpy classification ocr


    【解决方案1】:

    这似乎是堆栈溢出的情况。如果我理解您的问题,您有 3,682,800,000 个数组元素。什么是元素类型?如果它是一个字节,即大约 3 GB 的数据,很容易填满您的堆栈大小(通常约为 1 MB)。即使有一点元素,你仍然是 500 mb。尝试使用堆内存(您的机器上最多 8 个演出)

    【讨论】:

    • 是的!大概就是这个了。此外,处理和学习图像数据的一个好技巧是计算的流模型总是会更好。尝试一次学习一张图片,然后阅读下一张图片并忘记最后一张。希望这会有所帮助。
    • 每个元素都是一个 int (sys.getsizeof(int()) 返回 24) ...所以它实际上超过 3gigs!令我惊讶的是,当我尝试在 octave 中运行类似大小的数据集时,没有任何问题……这很奇怪吗?
    • @jlarks32:您的意思是创建 62 个不同的分类器并在每个分类器中检查“one v/s all”场景,还是作为每个样本动态更新模型权重(如在线学习类型交易)被观察到了吗?
    • 这意味着你的结构是 9 gigs。您需要压缩或重组。否则甚至堆都不能容纳所有这些。尝试@jlarks32 建议,谁应该将其发布为答案
    • @jlarks32:是的......我从来没有想过。第一个(62 个单独的分类器)确实让我印象深刻,但无法确保该方法甚至是正确的。非常感谢,我会试一试...以前从未尝试过:)
    【解决方案2】:

    我被鼓励将此作为解决方案发布,尽管上面的 cmets 可能更具启发性。

    用户程序的问题有两个。真的,它只是压倒堆栈。

    更常见的是一次处理一个图像,尤其是在计算机图形学或计算机视觉等图像处理领域。这可以很好地与 sklearn 一起使用,您可以在读取图像时更新模型。

    您可以使用从this 堆栈文章中找到的这段代码:

    import os
    rootdir = '/path/to/my/pictures'
    
    for subdir, dirs, files in os.walk(rootdir):
        for file in files:
            if file[-3:] == 'png': # or whatever your file type is / some check
                 # do your training here
                 img = imread(file)
    
                 img_gray = rgb2gray(img)
                 if n == 0 and m == 0: # n and m are global variables
                     n, m = np.shape(img_gray);
                 img_gray = np.reshape(img_gray, n*m)
    
                 # sample id stores the label of the training sample
                 img_gray = np.append(img_gray, sample_id) 
    
                 # samples is the final numpy ndarray
                 if len(samples) == 0: 
                     samples = np.append(samples, img_gray);
                     samples = np.reshape(samples, [1, n*m + 1])
                 else:
                     samples = np.append(samples, [img_gray], axis=0)
    

    这更多的是伪代码,但一般流程应该有正确的想法。让我知道我是否还有什么可以做的!如果您对一些很酷的深度学习算法感兴趣,还可以查看 OpenCV。它们是一堆很酷的东西,图像可以提供很好的样本数据。

    希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 2011-07-17
      • 2019-12-20
      • 2019-10-31
      • 2015-02-15
      • 2013-03-31
      • 1970-01-01
      • 1970-01-01
      • 2015-11-25
      • 2015-07-15
      相关资源
      最近更新 更多