Невозможно получить одинаковые выходные значения тензора на стороне C ++ - PullRequest
0 голосов
/ 16 июня 2020

Я пытаюсь делать прогнозы для проекта классификации 4 классов на стороне C ++, используя libtorch 1.4. Однако я не могу получить такие же прогнозы по сравнению со стороной Python. Во-первых, я получаю те же значения входного тензора непосредственно перед предсказанием. Когда я сравнивал выходные значения тензора, я заметил, что они разные. Вы можете найти эти значения на этом рисунке:

enter image description here

Левая сторона включает Python значения выходного тензора и результаты прогнозирования для каждого входного изображения.

Правая сторона включает значения выходного тензора C ++ и результаты прогнозирования для каждого входного изображения.

Не могли бы вы предложить решение для получения тех же значений выходного тензора и результатов прогнозирования?

1 Ответ

0 голосов
/ 17 июня 2020

Я заметил, что использовал функции opencv для применения нормализации с помощью этого кода:

subtract(image, Scalar(0.485, 0.456, 0.406), temp);
divide(temp, Scalar(0.229, 0.224, 0.225), image);

Эта операция изменяет только первый канал и не меняет другие каналы. По этой причине на самом деле значения входного тензора разные. Я применил нормализацию непосредственно к значениям тензора, написав этот код:

tensor_image = tensor_image.permute({ 2,0,1 });//chw
tensor_image = tensor_image.toType(torch::kFloat);
tensor_image = tensor_image.div(255.0);
//normalize
tensor_image[0] = tensor_image[0].sub_(0.485).div_(0.229);
tensor_image[1] = tensor_image[1].sub_(0.456).div_(0.224);
tensor_image[2] = tensor_image[2].sub_(0.406).div_(0.225);

Таким образом, я получил те же значения входного тензора по сравнению со стороной Python. После предсказания я получил те же значения выходного тензора. Моя проблема решена.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...