【问题标题】:Dot product of two vectors in tensorflow张量流中两个向量的点积
【发布时间】:2017-04-01 21:48:15
【问题描述】:

我想知道是否有一种简单的方法可以计算两个向量(即一维张量)的点积并在 tensorflow 中返回一个标量值。

给定两个向量 X=(x1,...,xn) 和 Y=(y1,...,yn),点积为 点(X,Y) = x1 * y1 + ... + xn * yn

我知道可以通过首先将向量 X 和 Y 广播到二维张量然后使用 tf.matmul 来实现这一点。但是,结果是一个矩阵,而我是在一个标量之后。

是否有像 tf.matmul 这样的特定于向量的运算符?

【问题讨论】:

    标签: python tensorflow dot-product


    【解决方案1】:

    你可以做 tf.mul(x,y),然后是 tf.reduce_sum()

    【讨论】:

    • (当然应该是 tf.multiply(x,y) )
    【解决方案2】:

    除了tf.reduce_sum(tf.multiply(x, y)),还可以tf.matmul(x, tf.reshape(y, [-1, 1]))

    【讨论】:

    • 请注意,如果您有一个尺寸为 (1234,) 的向量,这是唯一正确的答案
    【解决方案3】:

    在较新的版本中(我认为从 0.12 开始),您应该可以做到

    tf.einsum('i,i->', x, y)
    

    Before that,减少为标量似乎是不允许/不可能的。)

    【讨论】:

      【解决方案4】:

      你可以使用 tf.matmul 和 tf.transpose

      tf.matmul(x,tf.transpose(y))
      

      tf.matmul(tf.transpose(x),y)
      

      取决于 x 和 y 的尺寸

      【讨论】:

      • matmul 可以为您转置:例如tf.matmul(a, b, transpose_a=True, transpose_b=False)显然你也可以转置b。
      【解决方案5】:
      import tensorflow as tf
      
      x = tf.Variable([1, -2, 3], tf.float32, name='x')
      y = tf.Variable([-1, 2, -3], tf.float32, name='y')
      
      dot_product = tf.reduce_sum(tf.multiply(x, y))
      
      sess = tf.InteractiveSession()
      init_op = tf.global_variables_initializer()
      sess.run(init_op)
      
      dot_product.eval()
      
      Out[46]: -14
      

      这里,x 和 y 都是向量。我们可以进行元素乘积,然后使用 tf.reduce_sum 对结果向量的元素求和。此解决方案易于阅读,不需要重新整形。

      有趣的是,docs 中似乎没有内置的点积运算符。

      请注意,您可以轻松检查中间步骤:

      In [48]: tf.multiply(x, y).eval()
      Out[48]: array([-1, -4, -9], dtype=int32)
      

      【讨论】:

        【解决方案6】:

        也许使用新文档,您可以将点积的第一个参数或第二个参数的 transpose 选项设置为 true:

        tf.matmul(a, b, transpose_a=False, transpose_b=False, adjoint_a=False, adjoint_b=False, a_is_sparse=False, b_is_sparse=False, name=None)
        

        领先:

        tf.matmul(a, b, transpose_a=True, transpose_b=False)
        tf.matmul(a, b, transpose_a=False, transpose_b=True)
        

        【讨论】:

          【解决方案7】:

          计算两个张量(向量是一维张量)之间点积的最简单方法之一是使用tf.tensordot

          a = tf.placeholder(tf.float32, shape=(5))
          b = tf.placeholder(tf.float32, shape=(5))
          
          dot_a_b = tf.tensordot(a, b, 1)
          
          with tf.Session() as sess:
              print(dot_a_b.eval(feed_dict={a: [1, 2, 3, 4, 5], b: [6, 7, 8, 9, 10]}))
          # results: 130.0
          

          【讨论】:

            【解决方案8】:

            只需使用 * 和 reduce_sum

            ab = tf.reduce_sum(a*b)
            

            举个简单的例子如下:

            import tensorflow as tf
            a = tf.constant([1,2,3])
            b = tf.constant([2,3,4])
            
            print(a.get_shape())
            print(b.get_shape())
            
            c = a*b
            ab = tf.reduce_sum(c)
            
            with tf.Session() as sess:
                print(c.eval())
                print(ab.eval())
            
            # output
            # (3,)
            # (3,)
            # [2 6 12]
            # 20
            

            【讨论】:

            【解决方案9】:

            让我们假设您有两个列向量

            u = tf.constant([[2.], [3.]])
            v = tf.constant([[5.], [7.]])
            

            如果你想要一个 1x1 矩阵,你可以使用

            tf.einsum('ij,ik->jk',x,y)
            

            如果您对标量感兴趣,可以使用

            tf.einsum('ij,ik->',x,y)
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2017-01-30
              • 1970-01-01
              • 2019-11-08
              • 1970-01-01
              • 2018-03-14
              • 1970-01-01
              • 1970-01-01
              • 2019-11-26
              相关资源
              最近更新 更多