2017-05-21 7 views
1

1つのベクトルが[1,2,3,4]で、もう1つが[1,2,3,4]であるとします。は[1、4、9、16]でなければなりません。私がこの2つのベクトルのドット積をtheanoに書きたいのであれば、どうすればScanを使ってこれを達成できますか?スキャンを使ってtheanoの2つのベクトルのドット積を計算する方法

これは私のコードですが、結果は結果マトリックスの対角線として表示されます。

v1 = T.dvector('v1') 
v2 = T.dvector('v2') 
def myFunc(i, v1, v2, res): 
    subtensor = res[i] 
    return T.set_subtensor(subtensor, v1[i]*v2[i]) 

result, updates = theano.scan(fn=myFunc, 
           sequences=T.arange(v1.shape[0]), 
           non_sequences=[v1, v2], 
           outputs_info=v1 
          ) 
func = theano.function(inputs=[v1, v2], outputs=result, updates=updates) 
vec1 = np.asarray([1,2,3,4]) 
vec2 = np.asarray([1,2,3,4]) 

vec3 = func(vec1, vec2) 

print(vec3) 

これが結果です:

[[ 1. 2. 3. 4.] 
[ 1. 4. 3. 4.] 
[ 1. 2. 9. 4.] 
[ 1. 2. 3. 16.]] 

答えて

0

ただ、自分でそれを把握。

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

vec1 = T.dvector('vec1') 
vec2 = T.dvector('vec2') 

def oneStep(i, vec1, vec2): 
    return vec1[i] * vec2[i] 

result, updates = theano.scan(fn=oneStep, sequences=T.arange(vec1.shape[0]), non_sequences=[vec1, vec2]) 

fn1 = theano.function(
    inputs=[vec1, vec2], 
    outputs=result, 
    updates=updates 
) 


v1 = np.random.random((1,3)).flatten() 
v2 = np.random.random((1,3)).flatten() 
print(fn1(v1,v2)) 
print(v1*v2) 
0

あなたは2つのベクトルの内積のためtheano.tensor.dot使用することができます。 答えを参照してください。まだtheano.scanを使用したい場合、以下のコードはあなたの質問に固有の簡単なアプローチになります。

import theano 
import theano.tensor as T 
import numpy as np 
v1 = T.dvector('v1') 
v2 = T.dvector('v2') 
result, updates = theano.scan(fn=lambda a,b:a*b, 
          sequences=[v1, v2] 
         ) 
func = theano.function(inputs=[v1, v2], outputs=result) 
vec1 = np.asarray([1,2,3,4]) 
vec2 = np.asarray([1,2,3,4]) 
vec3 = func(vec1, vec2) 
print(vec3) 
関連する問題