如何解决如何用其他 pytorch 功能替换 torch.norm?
我想使用其他 Pytorch 函数替换 torch.norm
函数。
在 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
中的实现可以在 here 中找到。)
有些人遇到了这个问题,但 CoreMLTools 仍然不受支持(您可以从这个 issue 中查看)。
所以我想在没有 torch.norm
中使用的运算符的情况下替换它。
我尝试过 torch.linalg.norm()
和 numpy.linalg.norm
,但它们不受支持。
我创建了一个简单的合作笔记本来重现这一点。 请使用以下 colab 对其进行测试。 https://colab.research.google.com/drive/11o6rTxHzEgZ_Rc7nFZHd3TvPugybB88h?usp=sharing
解决方法
您可以尝试以下操作:
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-7
的 float32
顺序排列。
这里,范数是直接使用其数学定义计算的。您可以从 Wolfram MathWorld 中查看 this reference 以了解更多详细信息。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。