2016-10-23 4 views
0

Ich habe zwei Matrizen, die Form haben (1,3) und (3,1) Und ich möchte sie hinzufügen und eine Matrix (3,3) ausgeben In numpy, es funktioniert so :Hinzufügen von Broadcast-Matrix in theano

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

Und es gibt:

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

Jetzt würde ich verwenden Theanos mag die gleichen Dinge zu tun, um den Code zu beschleunigen. Mein Code ist wie folgt dargestellt:

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) 

Aber es gibt

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?') 

Ich bin verwirrt, warum es passiert? BTW, wird es schneller sein mit theano mit GPU als mit numpy?

Antwort

0

Nach stundenlangem Suchen und Lesen fand ich eine Antwort here.

Wenn ein numpy Array zu einer gemeinsam genutzten Variablen definiert wird, wird es zu einer symbolischen Variablen und ist kein numerisches Array mehr.

mit gemeinsamen Variablen zu berechnen, sollte der Code wie folgt geändert werden:

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) 

Auch ich verglich die Zeit der Matrix sende hinzufügen raubend Theano und numpy verwenden. Das Ergebnis ist

t1: 0.25077449798077067 
t2: 0.022930744192201424 

Es scheint, dass numpy schneller ist. Tatsächlich hat der Datentransfer zwischen GPU und CPU sehr viel Zeit in Anspruch genommen. Das ist der Grund, warum t2 viel kleiner ist als t1.