【问题标题】:Drawing samples from multinomial using Theano使用 Theano 从多项式中抽取样本
【发布时间】:2016-03-07 01:17:36
【问题描述】:

我目前正在实现卷积 RBM,为此我正在使用 Theano。

我当前的实现似乎很慢,分析表明这主要是由于 Gibbs 采样步骤造成的。 其实我是用Theano的shared randomstreams来生成多项式样本的。

但是,我发现 Theano 的随机流 here 的改进版本可以满足我的所有性能要求。

不幸的是,这个实验性随机生成器只支持二维矩阵,我必须将它用于 tensor4-object(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 上高效地完成。

因此,我们将不胜感激。

【问题讨论】:

    标签: python theano sampling convolution


    【解决方案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 和 reshape。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-11
      • 2021-01-20
      • 2017-12-06
      • 2022-11-23
      相关资源
      最近更新 更多