使用 Theano 从多项式中抽取样本
Drawing samples from multinomial using Theano
我目前正在实施卷积 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 上高效地完成它。
非常感谢任何帮助。
因此,我找到了适合我的解决方案,该解决方案使用一个相当简单的 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)
尽管按照这种方法批量大小有一些限制,但这个解决方案对我来说效果很好。
由于重塑矩阵可能变得非常大,我们可以 运行 进入随机生成器引发错误消息的情况,即使文档中没有提到它。
解决方案也非常快,因为 dimshuffle 和 reshape 是在 O(1) 中执行的。
我目前正在实施卷积 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 上高效地完成它。
非常感谢任何帮助。
因此,我找到了适合我的解决方案,该解决方案使用一个相当简单的 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)
尽管按照这种方法批量大小有一些限制,但这个解决方案对我来说效果很好。 由于重塑矩阵可能变得非常大,我们可以 运行 进入随机生成器引发错误消息的情况,即使文档中没有提到它。
解决方案也非常快,因为 dimshuffle 和 reshape 是在 O(1) 中执行的。