使用Theano从多项式绘制样本

时间:2015-12-02 17:11:32

标签: python theano sampling convolution

我目前正在实施卷积式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上高效地完成这项工作。

所以任何帮助都会非常感激。

1 个答案:

答案 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)中执行调光和重塑,因此解决方案也非常快。