我将 pytorch 预训练模型(.pt)转换为 torchscript 模型(.pt),以便在 Swift 5(ios-iphone6s,xcode 11)中使用它。在 Swift 中,模型的“预测”功能给了我它的嵌入值(张量)。由于它返回 NSNumber 数组作为预测的结果,我使用类型转换 [NSNumber] 到 [Double] 或 [Float] 来计算两个嵌入值之间的距离。L2归一化、点积等
然而,虽然 pytorch 版本得到了正确的答案,但 torchscript 模型得到了很多错误的答案。不仅答案不同,torchscript中两个embedding pair的距离计算也与PC(CPU,Pycharm)上的pytorch模型结果不同。事实上,在使用类型转换进行距离计算之前,NSNumber(Swift) 中的嵌入值与 float32(pytorch) 中的值相差很大。我使用了相同的输入图像。
我试图找到原因。有一次,我从 swift-torchscript 中复制了嵌入值([NSNumber])并计算了 pytorch 中两个嵌入之间的距离,以检查我在 Swift 中的距离计算实现是否有问题. 我使用了 torch.FloatTensor 来使用类型转换 [NSNumber] -> [Float]。我也试过[双]。结果,我发现了许多无限数。这个无限数与错误答案有关吗?
这个“inf”是什么意思?是计算错误还是类型转换错误?从 NSNumber 转换为 Float 或 Double 时我是否丢失了信息?如何快速从 torchscript 模型中获得正确的值?我应该检查什么?
我使用以下代码进行转换。pytorch -> 火炬脚本。
import torch
from models.inception_resnet_v1 import InceptionResnetV1
device = torch.device('cuda:0' if torch.cuda.is_available() else 'cpu')
resnet = InceptionResnetV1(pretrained='vggface2').eval().to(device)
example = torch.rand(1, 3, 160, 160)
traced_script_module = torch.jit.trace(resnet, example)
traced_script_module.save("mobile_model.pt")