2016-12-28 3 views
0

저는 오일러 각의 T.vector을 입력으로 사용하여 오일러 각에 해당하는 방향 벡터를 반환하는 Theano 함수를 작성하려고합니다. 먼저 벡터의 각 요소의 사인과 코사인을 취한 다음 회전 행렬에 배열합니다. 마지막으로 방향 벡터 [1, 0, 0]에이 회전 행렬을 곱합니다. 내가이 문제에 착수하고있는 것은이 NumPy 배열에 회전 행렬을 곱할 수 없다는 것입니다.Theano 함수는 입력의 개별 요소를 사용합니다

AsTensorError: ('Cannot convert [[Elemwise{mul,no_inplace}.0 Elemwise{mul,no_inplace}.0\n Elemwise{mul,no_inplace}.0]\n [Elemwise{add,no_inplace}.0 Elemwise{mul,no_inplace}.0\n Elemwise{add,no_inplace}.0]\n [Elemwise{add,no_inplace}.0 Elemwise{mul,no_inplace}.0\n Elemwise{add,no_inplace}.0]] to TensorType', <type 'numpy.ndarray'>) 

내가 행렬 연산을 통해이 회전 행렬을 만들 수있는 방법을 생각할 수 없다 :

import theano.tensor as T 
import theano 
import numpy as np 

euler_angles = T.vector('euler_angles', dtype=theano.config.floatX) 
origin_vec = theano.shared(np.asarray([1, 0, 0], 
             dtype=theano.config.floatX)) 
sinx = T.sin(euler_angles[0]) 
siny = T.sin(euler_angles[1]) 
sinz = T.sin(euler_angles[2]) 
cosx = T.cos(euler_angles[0]) 
cosy = T.cos(euler_angles[1]) 
cosz = T.cos(euler_angles[2]) 

# Create the rotation matrix 
rot_matrix = np.asarray([ 
     [cosy*cosz, -1*sinz, cosz * siny], 
     [(sinx*siny)+(cosx*cosy*sinz), cosx*cosz, (-1*cosy*sinx)+(cosx*siny*sinz)], 
     [(-1*cosx*siny)+(cosy*sinx*sinz), cosz*sinx, (cosx*cosy)+(sinx*siny*sinz)] 
    ]) 
vector = T.dot(origin_vec, rot_matrix) 
get_vector = theano.function([euler_angles], vector) 

은 마지막에서 두 번째 라인이 오류를 던졌습니다 :

내 코드입니다 오일러 각에. Theano가 컴파일 할 수있는 형식으로이 함수를 어떻게 만들 수 있습니까?

답변

1

theano.tensor.stacklists()을 사용하십시오.

rot_matrix = T.stacklists([[...], ...]) 
+0

감사합니다. 누구든지 더 많은 정보가 필요하다면 문서는 [here] (http://deeplearning.net/software/theano/library/tensor/basic.html?highlight=stacklists#theano.tensor.stacklists)입니다. –

+0

추가 질문 : Tensorflow에 해당 기능이 있는지 아는 사람 있습니까? 주위를 둘러 보았지만 아무것도 찾을 수 없습니다. 백엔드가 Theano이든 TF이든이 함수를 Keras에서 사용할 수있게 만들고 싶습니다. –