Python 使用Theano从多项式中提取样本

Python 使用Theano从多项式中提取样本,python,theano,sampling,convolution,Python,Theano,Sampling,Convolution,我目前正在实现一个卷积RBM,我正在使用Theano 我当前的实现似乎相当缓慢,分析表明这主要是由于Gibbs采样步骤。 事实上,我正在使用Theano来生成多项式样本 然而,我发现了Theano的random stream的改进版本,它满足了我所有的性能要求 不幸的是,这个实验性的随机生成器只支持二维矩阵,我必须将它用于tensor4对象(4D矩阵),因为这是Theano的nnet conv2d操作的结果 你知道有没有一种有效的方法可以从具有以下结构的4D矩阵中提取样本: 样本尺寸x 1 x

我目前正在实现一个卷积RBM,我正在使用Theano

我当前的实现似乎相当缓慢,分析表明这主要是由于Gibbs采样步骤。 事实上,我正在使用Theano来生成多项式样本

然而,我发现了Theano的random stream的改进版本,它满足了我所有的性能要求

不幸的是,这个实验性的随机生成器只支持二维矩阵,我必须将它用于tensor4对象(4D矩阵),因为这是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上高效地完成这项工作


因此,如果有任何帮助,我将不胜感激。

因此,我找到了一个解决方案,该解决方案使用了一个相当简单的dimshuffle/重塑组合,该组合在采样后撤消。

这个解决方案对我来说效果很好,尽管按照这种方法批量大小有一些限制。 由于重塑后的矩阵可能变得非常大,因此我们可能会遇到随机生成器发出错误消息的情况,即使文档中没有提到

由于dimshuffle和整形是在O(1)中执行的,因此解决方案也相当快

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)