【问题标题】:Triple tensor product with Tensorflow使用 Tensorflow 的三重张量积
【发布时间】:2020-01-03 16:42:59
【问题描述】:

假设我有一个矩阵A 和两个向量x,y,尺寸合适。我想计算点积x' * A * y,其中x' 表示转置。这应该产生一个标量。

Tensorflow 中是否有方便的 API 函数来执行此操作?

(请注意,我使用的是 Tensorflow 2)。

【问题讨论】:

    标签: tensorflow linear-algebra tensorflow2.0


    【解决方案1】:

    使用 tf.linalg.tensordot()。 See the documentation

    正如您在问题中提到的那样,您正在尝试查找点积。在这种情况下,tf.matmul() 将不起作用,因为它仅用于度量的叉积。

    演示代码sn-p

    import tensorflow as tf
    
    A = tf.constant([[1,4,6],[2,1,5],[3,2,4]])
    x = tf.constant([3,2,7])
    result = tf.linalg.tensordot(tf.transpose(x), A, axes=1)
    result = tf.linalg.tensordot(result, x, axes=1)
    print(result)
    

    结果会是

    >>>tf.Tensor(532, shape=(), dtype=int32)
    

    我想在这里提几点

    1. 不要忘记 tf.linalg.tensordot() 中的 axes 参数

    2. 当你创建tf.zeros(5) 时,它会创建一个形状为 5 的列表,它就像[0,0,0,0,0],当你转置它时,它会给你相同的列表。但是如果你像tf.zeros((5,1)) 那样创建它,它将是一个形状为(5,1) 的向量,结果将是

      [
      [0],[0],[0],[0],[0]
      ]
      

      现在你可以转置它,结果会有所不同,但我建议你做我提到的代码 sn-p。如果是点积,您不必为此烦恼太多。

    如果您仍然面临问题,将非常乐意为您提供帮助。

    【讨论】:

    • 谢谢。请注意,transpose 调用在 tf.linalg.tensordot(tf.transpose(x), A, axes=1) 中是不必要的(正如您稍后在帖子中解释的那样)。
    【解决方案2】:

    只需执行以下操作,

    import tensorflow as tf
    
    x = tf.constant([1,2])
    a = tf.constant([[2,3],[3,4]])
    y = tf.constant([2,3])
    
    
    z = tf.reshape(tf.matmul(tf.matmul(x[tf.newaxis,:], a), y[:, tf.newaxis]),[])
    print(z.numpy())
    

    返回

    >>> 49
    

    【讨论】:

      【解决方案3】:

      只需像这样使用tf.transpose 和乘法运算符: tf.transpose(x)* A * y.

      【讨论】:

      • 那行不通。你可以试试:x = tf.zeros(5); A = tf.zeros((5,5)); tf.transpose(x) * A * x,它返回一个矩阵而不是一个标量。
      • 是1×1矩阵吗?
      【解决方案4】:

      根据您的示例:

      x = tf.zeros(5)
      A = tf.zeros((5,5))
      

      怎么样

      x = tf.expand_dims(x, -1)
      tf.matmul(tf.matmul(x, A, transpose_a=True), x)
      

      【讨论】:

        猜你喜欢
        • 2016-03-10
        • 1970-01-01
        • 2016-02-15
        • 1970-01-01
        • 1970-01-01
        • 2016-10-18
        • 2020-04-15
        • 2018-11-21
        • 1970-01-01
        相关资源
        最近更新 更多