Memory Error: Numpy.random.normal

Memory Error: Numpy.random.normal

在 theano 中,以下代码片段抛出内存错误:

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。该片段取自全连接层的 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

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

A MemoryError 是 Python 的表达方式:"I tried getting enough memory for that operation but your OS says it doesn't have enough".

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

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

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

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