Используете ли вы InceptionResnetV1 из: https://github.com/timesler/facenet-pytorch? Когда вы ссылаетесь на модель pytorch при сравнении выходных данных, вы имеете в виду модель torchscript при запуске в pytorch или re snet как есть?
Если это последняя, вы уже проверяете что-то похожее, как показано ниже?
Что вы получаете, когда запускаете следующее:
print('Original:')
orig_res = resnet(example)
print(orig_res.shape)
print(orig_res[0, 0:10])
print('min abs value:{}'.format(torch.min(torch.abs(orig_res))))
print('Torchscript:')
ts_res = traced_script_module(example)
print(ts_res.shape)
print(ts_res[0, 0:10])
print('min abs value:{}'.format(torch.min(torch.abs(ts_res))))
print('Dif sum:')
abs_diff = torch.abs(orig_res-ts_res)
print(torch.sum(abs_diff))
print('max dif:{}'.format(torch.max(abs_diff)))
после определения 'traced_script_module'. Я получаю следующее:
Original:
torch.Size([1, 512])
tensor([ 0.0347, 0.0145, -0.0124, 0.0723, -0.0102, 0.0653, -0.0574, 0.0004,
-0.0686, 0.0695], device='cuda:0', grad_fn=<SliceBackward>)
min abs value:0.00034740756382234395
Torchscript:
torch.Size([1, 512])
tensor([ 0.0347, 0.0145, -0.0124, 0.0723, -0.0102, 0.0653, -0.0574, 0.0004,
-0.0686, 0.0695], device='cuda:0', grad_fn=<SliceBackward>)
min abs value:0.0003474018594715744
Dif sum:
tensor(8.1539e-06, device='cuda:0', grad_fn=<SumBackward0>)
max dif:5.960464477539063e-08
, что не идеально, но учитывая, что выходы имеют порядок не менее 10 ^ -4, и что число перед последним является суммой абсолютной разности 512 элементов, не значит, это кажется не слишком далеко для меня. Максимальная разница составляет около 10 ^ -8.
Кстати, вы можете изменить на:
example = torch.rand(1, 3, 160, 160).to(device)
Если вы получите что-то похожее для тестов выше, каковы какого типа значения вы получаете для первых 10 выходных значений, которые вы получаете из swift-torchscript как NSNumber, а затем, будучи приведенными в плавающем порядке, сравниваются с обоими одинаковыми срезами в выходных данных модели pytorch и torchscript-pytorch?