我目前正在实施卷积式RBM,而且我正在使用Theano。
我目前的实施似乎相当缓慢,分析表明它主要是由于Gibbs采样步骤。 事实上,我正在使用Theano的shared randomstreams来生成多项式样本。
然而,我找到了Theano的随机流here的改进版本,它满足了我的所有性能要求。
不幸的是,这个实验随机生成器只支持二维矩阵,我必须将它用于张量4对象(4D-Matrix),因为这是Theano的nnet conv2d操作的结果。
您是否知道从具有以下结构的4D矩阵中抽取样本是否有效:
样品化x 1 x N x M
我想从其中一个列(第三维)绘制,给我一个这样的代码:
for sample in range(numSamples):
for col in range(numCols):
drawMultinomial(n=1, pvals=data[sample,0,col,:])
但是这段代码真的很慢,我想在GPU上高效地完成这项工作。
所以任何帮助都会非常感激。
答案 0 :(得分: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)中执行调光和重塑,因此解决方案也非常快。