2017-04-11 35 views
-1

在theano下面的代碼片斷是拋出存儲器錯誤:內存錯誤:Numpy.random.normal

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 

有什麼辦法可以解決這個問題嗎?

+0

這是一個巨大的數組(8.22億元素!)。這實際上不太可能需要分配。 – y300

+1

解決方法很簡單:@MSeifert數組被用來保存深層神經網絡的參數用更少的元素試試吧:) – MSeifert

+0

,我們必須初始化所有參數,隨機獲得下手的問題。爲了減少你建議的參數數量,我們將不得不改變我不想要的網絡架構。 –

回答

0

一個MemoryError是說的蟒蛇道:「我試圖讓該操作足夠的內存,但你的OS說,它沒有足夠的」。

因此,有沒有解決方法。你必須以另一種方式來做(或者購買更多的RAM!)。我不知道你floatX是什麼,但你的數組包含轉化爲64*56*56*4096元素:如果您使用float64

  • 3.063 GB如果使用float32
  • 1.531 GB如果使用float16

    • 6.125 GB (不知道float16是否支持你的操作雖然)

    但隨着MemoryError S上的問題是,僅僅爲了逃避他們一次一般是不夠的。如果你不改變你的方法,你很快就會爲你做到這一點,需要一箇中間的或新的陣列(那麼你有兩個巨大的陣列)的操作再次得到問題或強制轉換到一個更高的D型(那麼你有兩個巨大的陣列而新的dtype更高,所以需要更多的空間)。

    所以,唯一可行的解​​決辦法是改變的方式,也許你可以通過計算子集(的map-reduce辦法)開始?