我正在使用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
关于如何以正确的方式做到这一点的任何想法?
答案 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上执行是否最佳。