【问题标题】:Memory Error: Numpy.random.normal内存错误:Numpy.random.normal
【发布时间】:2017-04-11 14:54:49
【问题描述】:

在theano中,以下代码sn-p抛出内存错误:

self.w = theano.shared(
        np.asarray(
            np.random.normal(
                loc=0.0, scale=np.sqrt(1.0/n_out), size=(n_in, n_out)),
            dtype=theano.config.floatX),
        name='w', borrow=True)

仅提及大小 n_in=64*56*56 和 n_out=4096。 sn-p 取自全连接层的 init 方法。查看回溯:

Traceback (most recent call last):
File "<stdin>", line 8, in <module>
File "final.py", line 510, in __init__
loc=0.0, scale=np.sqrt(1.0/n_out), size=(n_in, n_out)),
File "mtrand.pyx", line 1636, in mtrand.RandomState.normal    (numpy/random/mtrand/mtrand.c:20676)
File "mtrand.pyx", line 242, in mtrand.cont2_array_sc (numpy/random/mtrand/mtrand.c:7401)
MemoryError

有什么办法可以解决这个问题吗?

【问题讨论】:

  • 这是一个巨大的数组(8.22 亿个元素!)。您实际上不太可能需要分配它。
  • 解决方法很简单:尝试使用更少的元素:)
  • @MSeifert 该数组用于保存深度神经网络的参数,我们必须随机初始化所有参数才能开始解决问题。为了减少您所建议的参数数量,我们将不得不更改网络架构,这是我不想要的。

标签: python numpy memory theano


【解决方案1】:

MemoryError 是 Python 的说法:“我尝试为该操作获取足够的内存,但你的操作系统说它没有足够的内存”。

所以没有解决方法。您必须以另一种方式进行(或购买更多 RAM!)。我不知道您的 floatX 是什么,但您的数组包含 64*56*56*4096 元素,这些元素转换为:

  • 6.125 GB,如果你使用float64
  • 3.063 GB 如果你使用float32
  • 如果您使用 float16,则为 1.531 GB(但不确定您的操作是否支持 float16

MemoryErrors 的问题在于,仅仅一次 避开它们通常是不够的。如果您不改变您的方法,一旦您执行需要中间或新数组(然后您有两个巨大的数组)或强制转换为更高的 dtype(然后您有两个巨大的数组)的操作,就会再次遇到问题并且新的具有更高的 dtype,因此需要更多空间。

所以唯一可行的解​​决方法是改变方法,也许你可以从计算子集开始(map-reduce 方法)?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-02-04
    • 2013-04-25
    • 2021-10-05
    • 1970-01-01
    • 2011-09-27
    • 2011-04-08
    • 2015-02-06
    相关资源
    最近更新 更多