交换Theano符号矩阵的行

时间:2014-09-17 02:21:36

标签: python theano

我正在使用Theano实施并行回火Gibbs采样。我正在尝试创建一个带有矩阵X并交换其部分行的Theano函数。我有一个名为swaps的符号二进制向量,表示应该交换哪些行(即,如果swaps[i] == 1,则应交换X[i]X[i+1]。交换的顺序对我来说并不重要。

我正在尝试编写一个theano.scan,它通过swaps向量并逐行执行X的交换。问题是Theano不允许用符号变量做X[pos], X[pos + 1] = X[pos + 1], X[pos]之类的事情。这是我想要做的简单代码片段。

import numpy as np

import theano
import theano.tensor as T

def swap(swp, pos, idx):
    if swp: idx[pos], idx[pos + 1] = idx[pos + 1], idx[pos]
    return idx

max_length = 10
swaps = T.ivector('swaps')
idx   = T.ivector('idx')
pos   = T.iscalar('pos')

new_idx, updates = theano.scan(swap,
                               sequences=[swaps, T.arange(max_length)],
                               outputs_info=idx)

do_swaps = theano.function([swaps, idx], new_idx[-1], updates=updates)

idx_swapped = do_swaps(np.array([1, 1, 0, 1]), np.arange(5))
print idx_swapped

关于如何以正确的方式做到这一点的任何想法?

1 个答案:

答案 0 :(得分:0)

好的,这是我找到的一个非常简单的解决方案。

import numpy as np

import theano
import theano.tensor as T

def swap(swp, pos, X):
    return T.concatenate([X[:pos],X[[pos+swp]],X[[pos+1-swp]],X[pos+2:]])

max_length = 10
swaps = T.ivector('swaps')
pos   = T.iscalar('pos')
X     = T.vector('X')

new_X, _ = theano.scan(swap,
                       sequences=[swaps, T.arange(max_length)],
                       outputs_info=X)

do_swaps = theano.function([swaps, X], new_X[-1])

X_swapped = do_swaps(np.array([1, 1, 0, 1], dtype='int32'), np.arange(5))
print X_swapped

但是,我不确定在GPU上执行是否最佳。