Output berbeda dari Libtorch C ++ dan pytorch
Aug 20 2020
Saya menggunakan model penelusuran yang sama di pytorch dan libtorch tetapi saya mendapatkan output yang berbeda.
Kode Python:
import cv2
import numpy as np
import torch
import torchvision
from torchvision import transforms as trans
# device for pytorch
device = torch.device('cuda:0')
torch.set_default_tensor_type('torch.cuda.FloatTensor')
model = torch.jit.load("traced_facelearner_model_new.pt")
model.eval()
# read the example image used for tracing
image=cv2.imread("videos/example.jpg")
test_transform = trans.Compose([
trans.ToTensor(),
trans.Normalize([0.5, 0.5, 0.5], [0.5, 0.5, 0.5])
])
resized_image = cv2.resize(image, (112, 112))
tens = test_transform(resized_image).to(device).unsqueeze(0)
output = model(tens)
print(output)
Kode C ++:
#include <iostream>
#include <algorithm>
#include <opencv2/opencv.hpp>
#include <torch/script.h>
int main()
{
try
{
torch::jit::script::Module model = torch::jit::load("traced_facelearner_model_new.pt");
model.to(torch::kCUDA);
model.eval();
cv::Mat visibleFrame = cv::imread("example.jpg");
cv::resize(visibleFrame, visibleFrame, cv::Size(112, 112));
at::Tensor tensor_image = torch::from_blob(visibleFrame.data, { 1, visibleFrame.rows,
visibleFrame.cols, 3 }, at::kByte);
tensor_image = tensor_image.permute({ 0, 3, 1, 2 });
tensor_image = tensor_image.to(at::kFloat);
tensor_image[0][0] = tensor_image[0][0].sub(0.5).div(0.5);
tensor_image[0][1] = tensor_image[0][1].sub(0.5).div(0.5);
tensor_image[0][2] = tensor_image[0][2].sub(0.5).div(0.5);
tensor_image = tensor_image.to(torch::kCUDA);
std::vector<torch::jit::IValue> input;
input.emplace_back(tensor_image);
// Execute the model and turn its output into a tensor.
auto output = model.forward(input).toTensor();
output = output.to(torch::kCPU);
std::cout << "Embds: " << output << std::endl;
std::cout << "Done!\n";
}
catch (std::exception e)
{
std::cout << "exception" << e.what() << std::endl;
}
}
Model memberikan (1x512)
ukuran keluaran tensor seperti yang ditunjukkan di bawah ini.
Keluaran Python
tensor([[-1.6270e+00, -7.8417e-02, -3.4403e-01, -1.5171e+00, -1.3259e+00,
-1.1877e+00, -2.0234e-01, -1.0677e+00, 8.8365e-01, 7.2514e-01,
2.3642e+00, -1.4473e+00, -1.6696e+00, -1.2191e+00, 6.7770e-01,
...
-7.1650e-01, 1.7661e-01]], device=‘cuda:0’,
grad_fn=)
Keluaran C ++
Embds: Columns 1 to 8 -84.6285 -14.7203 17.7419 47.0915 31.8170 57.6813 3.6089 -38.0543
Columns 9 to 16 3.3444 -95.5730 90.3788 -10.8355 2.8831 -14.3861 0.8706 -60.7844
...
Columns 505 to 512 36.8830 -31.1061 51.6818 8.2866 1.7214 -2.9263 -37.4330 48.5854
[ CPUFloatType{1,512} ]
Menggunakan
- Pytorch 1.6.0.0
- Libtorch 1.6.0.0
- Studio visual 2019
- Windows 10
- Cuda 10.1
Jawaban
2 Rika Aug 20 2020 at 18:29
sebelum normalisasi akhir, Anda perlu menskalakan input Anda ke kisaran 0-1 dan kemudian melanjutkan normalisasi yang Anda lakukan. dikonversi menjadi float dan kemudian bagi dengan 255 akan membawa Anda ke sana. Ini potongan yang saya tulis, mungkin ada beberapa kesalahan sintaks, yang seharusnya terlihat.
Coba ini :
#include <iostream>
#include <algorithm>
#include <opencv2/opencv.hpp>
#include <torch/script.h>
int main()
{
try
{
torch::jit::script::Module model = torch::jit::load("traced_facelearner_model_new.pt");
model.to(torch::kCUDA);
cv::Mat visibleFrame = cv::imread("example.jpg");
cv::resize(visibleFrame, visibleFrame, cv::Size(112, 112));
at::Tensor tensor_image = torch::from_blob(visibleFrame.data, { visibleFrame.rows,
visibleFrame.cols, 3 }, at::kByte);
tensor_image = tensor_image.to(at::kFloat).div(255).unsqueeze(0);
tensor_image = tensor_image.permute({ 0, 3, 1, 2 });
ensor_image.sub_(0.5).div_(0.5);
tensor_image = tensor_image.to(torch::kCUDA);
// Execute the model and turn its output into a tensor.
auto output = model.forward({tensor_image}).toTensor();
output = output.cpu();
std::cout << "Embds: " << output << std::endl;
std::cout << "Done!\n";
}
catch (std::exception e)
{
std::cout << "exception" << e.what() << std::endl;
}
}
Saya tidak memiliki akses ke sistem untuk menjalankan ini jadi jika Anda menghadapi komentar di bawah.
Selalu Menjadi Ancaman: Mengapa Orang Berkulit Coklat dan Hitam Tidak Bisa Nyaman di Amerika Serikat
Jana Duggar: Semua yang Dia Katakan Tentang Cinta dan Jendela 5 Tahunnya untuk Menemukan 'Yang Satu'