добавление матрицы broadcastble в theano

#python #theano

#python #theano

Вопрос:

У меня есть две матрицы, которые имеют форму (1,3) и (3,1), и я хочу добавить их и вывести матрицу (3,3) в numpy, это работает следующим образом:

 import numpy as np
a = np.array([0,1,2])
b = a.reshape(3,1)
a b
  

И это выводит:

 array([0,1,2],
[1,2,3],
[2,3,4]]
  

Теперь я хотел бы использовать theano для выполнения тех же действий, чтобы ускорить код.
Мой код показан следующим образом:

 label_vec1 = T.imatrix('label_vector')
label_vec2 = T.imatrix('label_vector')
alpha_matrix = T.add(label_vec1, label_vec2)
alpha_matrix_compute = theano.function([label_vec1,label_vec2],alpha_matrix)

a = numpy.array([[0,1,2]])
b = numpy.array([[0],[1],[2]])#
a1=theano.shared(numpy.asarray(a), broadcastable =(True,False))
b1 = theano.shared(numpy.asarray(b),broadcastable=(False, True))
c = alpha_matrix_compute(a1,b1)
  

Но это выводит

 TypeError: ('Bad input argument to theano function at index 0(0-based)', 'Expected an array-like object, but found a Variable: maybe you are trying to call a function on a (possibly shared) variable instead of a numeric array?')
  

Я в замешательстве, почему это происходит?
Кстати, будет ли быстрее использовать theano с графическим процессором, чем использовать numpy?

Ответ №1:

После нескольких часов поиска и чтения я нашел ответ здесь.

При определении массива numpy в разделяемую переменную он становится символьной переменной и больше не является числовым массивом.

Для вычисления с общими переменными код должен быть изменен следующим образом:

 a = numpy.array([[0,1,2]])
b = numpy.array([[0],[1],[2]])#
#b = a.reshape(a.shape[1],a.shape[0])
a1=theano.shared(numpy.asarray(a), broadcastable =(True,False), borrow =True)
b1 = theano.shared(numpy.asarray(b),broadcastable=(False, True),borrow = True)

alpha_matrix = T.add(a1, b1)
alpha_matrix_compute = theano.function([], alpha_matrix)

s_t_1 = timeit.default_timer()
for i in range(10000):
    c = alpha_matrix_compute()
e_t_1 = timeit.default_timer()
for i in range(10000):
    c = numpy.add(a,b)
e_t_2 = timeit.default_timer()
print('t1:',e_t_1-s_t_1)
print('t2:',e_t_2-e_t_1)
  

Кроме того, я сравнил время, затрачиваемое на добавление широковещательной матрицы с использованием theano и numpy. Результатом является

 t1: 0.25077449798077067
t2: 0.022930744192201424
  

Кажется, что numpy работает быстрее. На самом деле, передача данных между GPU и CPU заняла много времени. Это причина, по которой t2 намного меньше, чем t1.