内存错误:Numpy.random.normal

时间:2017-04-11 14:54:50

标签: python numpy memory theano

在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

我们有什么方法可以解决这个问题吗?

1 个答案:

答案 0 :(得分:1)

Threading.Thread.Sleep(TimeSpan.FromMilliseconds(infoReader.Length / 1000)) 是Pythons的说法:&#34;我尝试为该操作获得足够的内存,但是你的操作系统认为它没有足够的内容&#34;。

所以没有解决方法。你必须采取另一种方式(或购买更多内存!)。我不知道您的MemoryError是什么,但您的数组中包含的floatX元素转换为:

  • 6.125 GB,如果您使用64*56*56*4096
  • 如果您使用float64
  • ,则为3.063 GB
  • 1.531 GB,如果您使用float32(不确定float16是否支持您的运营)

float16的问题在于,只要避免它们一次通常就不够了。如果你不改变你的方法,一旦你做一个需要中间或新阵列的操作(然后你有两个巨大的阵列)或者强制要求更高的dtype(那么你),你会再次遇到问题有两个巨大的阵列,新的阵列有更高的dtype,所以需要更多的空间。)

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