在官方PyTorch C ++在GitHub上的例子在这里 你可以看到一个类的奇怪定义:
class CustomDataset : public torch::data::datasets::Dataset<CustomDataset> {...}
Run Code Online (Sandbox Code Playgroud)
我的理解是,这定义了一个CustomDataset“继承自”或“扩展”的类torch::data::datasets::Dataset<CustomDataset>。这对我来说很奇怪,因为我们正在创建的类是从另一个类继承的,该类由我们正在创建的类进行参数化......这甚至是如何工作的?这是什么意思?在我看来,这就像一个Integer继承自的类vector<Integer>,这似乎很荒谬。
我在 pytorch 和 libtorch 中使用相同的跟踪模型,但得到不同的输出。
\nimport cv2\nimport numpy as np \nimport torch\nimport torchvision\nfrom torchvision import transforms as trans\n\n\n# device for pytorch\ndevice = torch.device(\'cuda:0\')\n\ntorch.set_default_tensor_type(\'torch.cuda.FloatTensor\')\n\nmodel = torch.jit.load("traced_facelearner_model_new.pt")\nmodel.eval()\n\n# read the example image used for tracing\nimage=cv2.imread("videos/example.jpg")\n\ntest_transform = trans.Compose([\n trans.ToTensor(),\n trans.Normalize([0.5, 0.5, 0.5], [0.5, 0.5, 0.5])\n ]) \n\nresized_image = cv2.resize(image, (112, 112))\n\ntens = test_transform(resized_image).to(device).unsqueeze(0)\noutput = model(tens)\nprint(output)\nRun Code Online (Sandbox Code Playgroud)\n#include <iostream>\n#include <algorithm> \n#include <opencv2/opencv.hpp>\n#include <torch/script.h>\n\n\nint main()\n{\n try\n {\n torch::jit::script::Module model = torch::jit::load("traced_facelearner_model_new.pt");\n model.to(torch::kCUDA);\n model.eval();\n\n cv::Mat visibleFrame = cv::imread("example.jpg");\n\n cv::resize(visibleFrame, visibleFrame, cv::Size(112, 112));\n …Run Code Online (Sandbox Code Playgroud) 我正在尝试将以下 Python 代码转换为其等效的 libtorch:
tfm = np.float32([[A[0, 0], A[1, 0], A[2, 0]],
[A[0, 1], A[1, 1], A[2, 1]]
])
Run Code Online (Sandbox Code Playgroud)
在 Pytorch 中,我们可以简单地使用torch.stack或简单地使用torch.tensor()如下所示:
tfm = torch.tensor([[A_tensor[0,0], A_tensor[1,0],0],
[A_tensor[0,1], A_tensor[1,1],0]
])
Run Code Online (Sandbox Code Playgroud)
然而,在 libtorch 中,这并不成立,那就是我不能简单地这样做:
auto tfm = torch::tensor ({{A.index({0,0}), A.index({1,0}), A.index({2,0})},
{A.index({0,1}), A.index({1,1}), A.index({2,1})}
});
Run Code Online (Sandbox Code Playgroud)
甚至使用 a 也std::vector不起作用。同样的事情也发生在 torch::stack 上。我目前正在使用三个torch::stack来完成此任务:
auto x = torch::stack({ A.index({0,0}), A.index({1,0}), A.index({2,0}) });
auto y = torch::stack({ A.index({0,1}), A.index({1,1}), A.index({2,1}) });
tfm = torch::stack({ x,y });
Run Code Online (Sandbox Code Playgroud)
那么有没有更好的方法来做到这一点呢?我们可以使用单行代码来完成此操作吗?
我在 Pytorch C++ 前端使用 TorchScript 模型。
Python 中的模型返回一个outputdict 作为 Dict[str, List[torch.Tensor]].
当我在 C++ 中使用它时,它返回一个c10::Dict<c10::IValue, c10::IValue>. 这段 Python 代码的等价物是什么:
value_a = output['key_a']
value_b = output['key_b']
Run Code Online (Sandbox Code Playgroud)
在 C++ 中从中获取值c10::Dict?
我已经尝试过了,但它不起作用。
torch::IValue key_a("key_a");
torch::IValue key_b("key_b");
c10::IValue value_a = output[key_a];
c10::IValue value_b = output[key_b];
std::cout << value_a << std::endl;
std::cout << value_b << std::endl;
Run Code Online (Sandbox Code Playgroud)
和错误:
error: type 'c10::Dict<c10::IValue, c10::IValue>' does not provide a subscript operator
Run Code Online (Sandbox Code Playgroud) 我下载了 libtorch 并在 macbook pro ARM 上制作了这些文件:
example-app/
build/
libtorch/
CMakeLists.txt
example-app.cpp
Run Code Online (Sandbox Code Playgroud)
然后我使用这些命令来构建火炬:
cmake -DCMAKE_PREFIX_PATH=/path-to-example-app/example-app/libtorch
make
Run Code Online (Sandbox Code Playgroud)
我收到此错误:
building for macOS-x86_64 but attempting to link with file built for unknown-arm64
Run Code Online (Sandbox Code Playgroud)
你能帮助我吗?
如果我们<<一个torch::Tensor
#include <torch/script.h>
int main()
{
torch::Tensor input_torch = torch::zeros({2, 3, 4});
std::cout << input_torch << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我们看
(1,.,.) =
0 0 0 0
0 0 0 0
0 0 0 0
(2,.,.) =
0 0 0 0
0 0 0 0
0 0 0 0
[ CPUFloatType{2,3,4} ]
Run Code Online (Sandbox Code Playgroud)
如何获得张量形状(即2,3,4)?我在https://pytorch.org/cppdocs/api/classat_1_1_tensor.html?highlight=tensor中搜索了API 调用,但找不到。而且我搜索了operator<<重载代码,也没有找到。
使用 C++ libtorch 前端 Pytorch
我想torch::Tensor从 C++double[]数组创建一个 。来自遗留的 C/C++ API。我在文档和论坛中都找不到关于该主题的简单文档。
就像是:
double array[5] = {1, 2, 3, 4, 5};
auto tharray = torch::Tensor(array, 5, torch::Device(torch::kCUDA));
Run Code Online (Sandbox Code Playgroud)
我发现的唯一的事情就是用torch::from_blob后来我就必须clone()和使用to(device),如果我想与CUDA使用它。
double array[] = { 1, 2, 3, 4, 5};
auto options = torch::TensorOptions().dtype(torch::kFloat64);
torch::Tensor tharray = torch::from_blob(array, {5}, options);
Run Code Online (Sandbox Code Playgroud)
有没有更清洁的方法呢?
我正在使用 Torch C++ 前端并希望在其中包含一个具有指定值的张量。为了实现这一点,可以手动分配内存并设置值,然后使用torch::from_blob在内存块上构建张量,但对我来说似乎不够干净。
在这个文档的最底部我发现我可以使用下标直接访问和修改数据。然而,这种方法有很大的运行时间开销,可能是因为下标访问会将张量的元素视为 0-d 张量。以下代码在我的机器上会花费超过 2 秒(-O3优化级别),这对于现代 CPU 来说太长了。
torch::Tensor tensor = torch::empty({1000, 1000});
for(int i=0; i < 1000; i++)
{
for(int j=0 ; j < 1000; j++)
{
tensor[i][j] = calc_tensor_data(i,j);
}
}
Run Code Online (Sandbox Code Playgroud)
有没有干净快速的方法来实现这个目标?
似乎有几种方法可以在 iOS 上运行 Pytorch 模型。
上述方法有什么区别?为什么人们使用 caffe2 或需要模型格式转换的 Core-ml (.mlmodel),而不是 LibTorch?
我目前正在使用该has_storage()方法来检查张量是否为空,但我想知道除此之外还有什么更好的方法!以及除了初始化torch::Tensor总是有一个存储而空的没有的事实之外,使用这个是否有任何影响!