Ошибка при преобразовании модели PyTorch в TorchScript - PullRequest
0 голосов
/ 17 декабря 2018

Я пытаюсь следовать руководству PyTorch для загрузки моделей в C ++ .

Следующий пример кода работает:

import torch
import torchvision

# An instance of your model.
model = torchvision.models.resnet18()

# An example input you would normally provide to your model's forward() method.
example = torch.rand(1, 3, 224, 224)

# Use torch.jit.trace to generate a torch.jit.ScriptModule via tracing.
traced_script_module = torch.jit.trace(model, example)

Однако при попытке другихв сетях, таких как squeezenet (или alexnet), мой код завершается ошибкой:

sq = torchvision.models.squeezenet1_0(pretrained=True)
traced_script_module = torch.jit.trace(sq, example) 

>> traced_script_module = torch.jit.trace(sq, example)                                      
/home/fabio/.local/lib/python3.6/site-packages/torch/jit/__init__.py:642: TracerWarning: Output nr 1. of the traced function does not match the corresponding output of the Python function.
 Detailed error:
Not within tolerance rtol=1e-05 atol=1e-05 at input[0, 785] (3.1476082801818848 vs. 3.945478677749634) and 999 other locations (100.00%)
  _check_trace([example_inputs], func, executor_options, module, check_tolerance, _force_outplace)

1 Ответ

0 голосов
/ 17 декабря 2018

Я только что выяснил, что модели, загруженные из torchvision.models, по умолчанию находятся в режиме поезда.AlexNet и SqueezeNet имеют уровни Dropout, что делает вывод недетерминированным в режиме поезда.Простое переключение в режим eval решило проблему:

sq = torchvision.models.squeezenet1_0(pretrained=True)
sq.eval()
traced_script_module = torch.jit.trace(sq, example) 
...