【问题标题】:how to use scan to compute Dot-product of two vectors in theano如何使用扫描计算theano中两个向量的点积
【发布时间】:2017-10-21 11:15:42
【问题描述】:

假设一个向量是 [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.]]

【问题讨论】:

    标签: python theano theano.scan


    【解决方案1】:

    自己想办法。 看答案:

    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)
    

    【讨论】:

      【解决方案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)
      

      【讨论】:

        猜你喜欢
        • 2016-03-22
        • 1970-01-01
        • 1970-01-01
        • 2016-05-07
        • 2015-08-06
        • 1970-01-01
        • 2014-10-06
        • 2014-09-08
        相关资源
        最近更新 更多