如何使用扫描来计算theano中两个向量的Dot-product

时间:2017-05-21 21:30:27

标签: python theano theano.scan

让我们说,一个向量是[1,2,3,4],另一个是[1,2,3,4],所以结果应该是[1,4,9,16] ]。如果我想在theano中写出这两个向量的点积,我怎么能用Scan来实现呢?

这是我的代码,但结果显示为结果矩阵的对角线。

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.]]

2 个答案:

答案 0 :(得分:0)

自己弄清楚。 见答案:

var result = pizza().Result;

答案 1 :(得分:0)

您可以将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)