2015-12-02 53 views
2

我目前正在實現一個卷積RBM,我正在使用Theano。使用Theano繪製多項式樣本

我目前的實現似乎很慢,分析表明它主要是由於吉布斯採樣步驟。實際上,我使用Theano的shared randomstreams來生成多項式樣本。

但是,我發現了Theano的隨機流here的改進版本,它可以滿足我所有的性能要求。

不幸的是,這個實驗性的隨機發生器只支持二維矩陣,我必須用它作爲張量4-對象(4D矩陣),因爲這是Theano的nnet conv2d操作的結果。

你知道,如果有從具有以下結構的四維矩陣得出樣品的有效途徑:

的採樣大小×1×N×M的

,我想從一個畫列(第三個維度),給我這樣的代碼:

for sample in range(numSamples): 
     for col in range(numCols): 
      drawMultinomial(n=1, pvals=data[sample,0,col,:]) 

但這代碼將是非常緩慢的,我想高效的GPU做到這一點。

所以任何幫助將不勝感激。

回答

1

所以我找到了解決方案,爲我制定了一個相當簡單的dimshuffle/reshape組合,取消後取消。

def sampleVisibleLayer (self, V): 
    reshaped = V.dimshuffle(0, 1, 3, 2).reshape((V.shape[0]*V.shape[3], V.shape[2])) 
    S_reshaped = self.theano_rng.multinomial(n=1,pvals=reshaped) 
    S = S_reshaped.reshape((V.shape[0], 1, V.shape[3], V.shape[2])).dimshuffle(0, 1, 3, 2) 

該解決方案的工作很適合我,即使批量大小有以下這種方法一些限制。 由於重構後的矩陣可能會變得非常大,我們可能遇到這樣的情況,即使它在文檔中沒有提及,隨機生成器會產生一條錯誤消息。

該解決方案也相當快,因爲​​在O(1)中執行了dimshuffle和整形。