2016-02-01 2 views
0

Я пытаюсь сделать некоторые символические вычисления, используя индексирование символической переменной.Индексирование переменной тензора

X = T.matrix('X') 
y = T.matrix('y') 
z = T.dot(T.dot(X,y[0]),y[1]).norm(L=2) 
callable_function = theano.function([y,X], z) 
callable_function(np.array([np.array([[3],[5]]),np.array([[4,1]])]),np.array([1,2])) 

И я получаю

AttributeError: ('Bad input argument to theano function with name "C:/Users/LIKAN/PycharmProjects/deepEEG/test.py:17" at index 0(0-based)', "'float' object has no attribute 'dtype'") 

Как правильно использовать символьную переменную индексацию?

ответ

1

Вы объявляете как y, так и X в качестве матриц, но ваши входы в скомпилированную функцию Anano представляют собой массив объектов и вектор.

np.array([np.array([[3],[5]]),np.array([[4,1]])]) - массив объектов, потому что он сконструирован как массив массивов numpy. Обратите внимание, что np.array([np.array([[3],[5]]),np.array([[4,1]])]).dtype == object.

Чтобы создать матрицу, просто используйте многомерный массив в конструкции массива numpy. Вам даже не нужно создавать массивы numpy, просто передайте списки ванильных Python. Поскольку ваш второй аргумент (для X) является вектором, я предположил, что введенное значение верное и объявление символической переменной неверно. С этими изменениями выполняется следующий код:

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

X = T.vector('X') 
y = T.matrix('y') 
z = T.dot(T.dot(X,y[0]),y[1]).norm(L=2) 
callable_function = theano.function([y,X], z) 
print callable_function([[3,5],[4,1]], [1,2]) 
+0

Спасибо! Но у меня все еще есть проблемы. Мне нужно, чтобы y был списком (массивом) матриц, а X - матрицей. – user3271237

+0

Theano не поддерживает списки. Если все матрицы имеют одинаковую форму, тогда вы можете объединить их все вместе в «тензор3». В качестве альтернативы, если вы знаете, сколько матриц будет в списке, просто передайте их как отдельные входы в функцию Theano. –

Смежные вопросы