【问题标题】:Create N x M Tensor matrix with two Tensor vectors and apply a function for each (n,m) pair使用两个张量向量创建 N x M 张量矩阵,并为每个 (n,m) 对应用一个函数
【发布时间】:2020-03-31 23:08:23
【问题描述】:

我有两个形状为 (100,) 的张量 X 和 Z,我想创建一个形状为 (100, 100) 的张量 X x Z。

对于这个矩阵中的每个对元素,我想应用一些我已经定义的函数,即 fn(x,z) 用于矩阵中的每个可能组合。

我是 TensorFlow 的新手,我习惯于按顺序思考,在处理 numpy 数组时,每个向量上有两个 for 循环。

如何在 TensorFlow 中做到这一点?非常感谢。

【问题讨论】:

  • 您希望该解决方案适用于任何功能fn(x,z),还是您心中有一个示例?答案会改变函数是否线性可分。
  • @Lescurel 感谢您的回复。该函数本身是非线性的,用于计算 x 和 z 之间的协方差。我正在尝试计算高斯过程的协方差矩阵,因此想将其应用于矩阵形式的每一对。
  • 用函数的例子给出答案会更容易。如果fn 只是简单数学函数的组合,例如fn = lambda x, z: tf.exp(tf.sin(x) / (tf.square(z) + 1)),你只需要使用像fn(tf.expand_dims(x, 1), z)这样的广播。

标签: python tensorflow


【解决方案1】:

一般问题

你可以创建一个自定义层来解决这个问题。

import tensorflow as tf
from tensorflow.keras.layers import Layer


def fn(x, y):
    return x + y


class PairMatrix(Layer):
    def __init__(self, func=None):
        super(PairMatrix, self).__init__()
        self.func = func

    def call(self, inputs, **kwargs):
        X, Y = tf.meshgrid(inputs[0], inputs[1])
        return self.func(X, Y)


x = tf.constant([1, 2, 3])
y = tf.constant([1, 2, 3])

z = PairMatrix(func=fn).apply([x, y])

应该创建一个以函数为参数的层。调用时,该函数将应用于输入 x 和 y 构造的网格。

在上面的简单测试用例中,产生的输出是:

z = tf.Tensor([[2 3 4]
               [3 4 5]
               [4 5 6]], shape=(3, 3), dtype=int32)

关于您的评论

如果只是你感兴趣的协方差,你可以使用tfp.stats.covariance

【讨论】:

    猜你喜欢
    • 2020-11-18
    • 1970-01-01
    • 2014-12-24
    • 1970-01-01
    • 2020-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多