首页 > 解决方案 > 如何用其他 pytorch 函数替换 torch.norm?

问题描述

我想torch.norm使用其他 Pytorch 函数替换该函数。

我能够在不是矩阵torch.norm的情况下进行替换x,如下面的代码所示。

import torch
x = torch.randn(9)
out1 = torch.norm(x)
out2 = sum(abs(x)**2)**(1./2)
out1 == out2
>> tensor(True)

但是当 x 是矩阵时,我不知道如何替换它。特别是,我想在我的情况下替换它dim=1 and keepdim=True

x = torch.randn([3, 136, 64, 64])
out1 = torch.norm(x, dim=1, keepdim=True)
out2 = ???
out1 == out2

背景:

我正在将 Pytorch 模型转换为 CoreML,但函数中_VF.frobenius_norm定义的运算符torch.norm未使用 CoreMLTools 实现。(里面的实现torch.norm可以在这里找到。)

少数人遇到了这个问题,但 CoreMLTools 仍然不受支持(您可以从这个问题中查看)。所以我想在没有使用的运算符的情况下替换它torch.norm

我试过了torch.linalg.norm()numpy.linalg.norm但不支持。

我创建了一个简单的协作笔记本来重现这一点。请使用以下 colab 对其进行测试。 https://colab.research.google.com/drive/11o6rTxHzEgZ_Rc7nFZHd3TvPugybB88h?usp=sharing

标签: pythondeep-learningpytorchcoremlcoremltools

解决方案


您可以尝试以下方法:

import torch
x = torch.randn([3, 136, 64, 64])
out1 = torch.norm(x, dim=1, keepdim=True)
out2 = torch.square(x).sum(dim=1, keepdim=True).sqrt()

请注意,由于精度上的小误差,它out1 == out2不会完全给出。True您可以检查错误是否按1e-7for的顺序排列float32

在这里,范数是直接使用其数学定义计算的。您可以从 Wolfram MathWorld 中查看此参考以了解更多详细信息。


推荐阅读