【问题标题】:Matrix norm in TensorFlowTensorFlow 中的矩阵范数
【发布时间】:2021-06-28 17:26:00
【问题描述】:

我需要计算 Frobenius 范数才能使用 TensorFlow 框架实现这个公式:

其中w 是一个 50 行 100 列的矩阵。

我想写点东西,但我不明白如何填写axis 参数。

tf.pow(
    tf.norm(x, ord='fro', axis=?), 2
)

根据TensorFlow docs,我必须使用 2 元组(或 2 列表),因为它确定了计算矩阵范数的张量轴,但我只需要一个普通的 Frobenius 范数。以SciPy为例,我可以不指定任何轴。

那么,我应该使用什么作为axis 来模拟SciPy 函数?

【问题讨论】:

    标签: python tensorflow


    【解决方案1】:

    所以 Frobenius 范数是对 nxm 矩阵的总和,但 tf.norm 允许批量处理多个向量和矩阵。

    为了更好地理解,假设你有一个 3 阶张量:

    t = [[[2], [4], [6]], [[8], [10], [12]], [[14], [16], [18]]]

    可以看作是几个矩阵在一个方向上对齐,但函数本身无法计算出哪一个。它可以是以下矩阵中的任意一个:

    [2, 4, 6] , [8 ,10, 12], [14, 16, 18]

    [2 8 14], [4, 10, 16], [6, 12, 18]

    所以基本上axis 告诉您在 Frobenius 范数中进行求和时要考虑哪些方向。

    在您的情况下,[1,2][-2,-1] 中的任何一个都可以解决问题。

    【讨论】:

      【解决方案2】:

      与张量的维数无关,

      tf.sqrt(tf.reduce_sum(tf.square(w)))
      

      应该可以解决问题。

      【讨论】:

        【解决方案3】:

        支持负索引。示例:如果您在运行时传递的张量可以是矩阵或一批矩阵,请传递 axis=[-2,-1] 而不是 axis=None 以确保计算矩阵范数。

        我刚刚测试并且 [-2,-1] 有效。

        【讨论】:

        • 我也读过,但我不清楚背后的原因。
        【解决方案4】:

        在我看来你最好直接打电话

        tf.reduce_sum(tf.multiply(x, x))
        

        调用norm 对上述结果求平方根,然后调用pow 对任何功率都有效,因此可能会使用复杂的算法,这太过分了。

        【讨论】:

        • 我不认为 'pow' 在这种情况下使用复杂的算法,因为当指数为 2 或 3(最常用)时,它可能经过优化以更容易工作。无论如何,我说的是 Frobenius 范数,而不仅仅是欧几里得范数。
        • 因此我的回答中出现了“潜在”。您会说 fro 和 euclidean norm 之间的区别是什么?根据您在帖子中链接的文档,它们实际上是相同的。
        • 老实说,我不知道有什么区别,但我正在尝试编写一个同时包含欧几里得规范和 Frobenius 规范的公式。所以,至少从数学角度来看,它们是不同的。
        • 我喜欢你深入研究问题的态度,也许我也可以将你的方法与规范的方法进行比较。
        【解决方案5】:

        试试轴=(0,1)。我想,它会解决你的问题!

        【讨论】:

        【解决方案6】:

        Frobenius 范数不适用于矩阵。你需要创建向量。

        1. 将您的数组重塑为batchsize,-1
        2. 使用tf.norm(reshaped_data, ord= 'fro', axis = (0, 1))
        3. 在 tensorflow 急切执行上使用 reshape 可能会出错。从version = 2.5 开始使用

        import tensorflow.python.ops.numpy_ops.np_config as np_config np_config.enable_numpy_behavior()

        例如我如何使用它:

        heat_difference = gt_hm - pd_hm
        heat_difference = heat_difference.reshape(batch_size, -1)
        hm_loss = tf.square(tf.norm(heat_difference, ord='fro', axis=(0, 1)) / batch_size)
        

        【讨论】:

          猜你喜欢
          • 2022-01-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-09-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-05-27
          相关资源
          最近更新 更多