2014-09-17 2 views
1

나는 Theano를 사용하여 평행 템퍼링 Gibbs 샘플링을 구현 중입니다. 나는 행렬 X을 취하고 행의 일부를 교체하는 Theano 함수를 작성하려고합니다. 어떤, 다음 X[i]X[i+1] 바꿔야합니다, 즉 행을 바꿔야 나타내는 swaps 명명 된 기호식 이진 벡터가 있습니다. 스와핑 순서는 중요하지 않습니다. Theano 기호 행의 행 바꾸기

은 내가 swaps 벡터를 통해가는 theano.scan를 작성하려고하고 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

좋아, 여기 내가 찾은 정말 간단한 해결책이있다.

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에서 실행하기에 최적인지 또는 아닌지 잘 모르겠습니다.

+1

인덱스의 벡터를 먼저 교환하고 ('T.arange (X.shape [0])') 한 번에 전체 배열을 다시 색인하고자 할 수도 있습니다 ('X [p]', 여기서'p '는 순열 색인의 목록이다) – eickenberg