标签: libtorch

libtorch (PyTorch C++) 奇怪的类语法

在官方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>,这似乎很荒谬。

c++ pytorch libtorch

5
推荐指数
1
解决办法
342
查看次数

Libtorch C++ 和 pytorch 的不同输出

我在 pytorch 和 libtorch 中使用相同的跟踪模型,但得到不同的输出。

\n

Python代码:

\n
import 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)\n
Run Code Online (Sandbox Code Playgroud)\n

C++代码:

\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)

c++ jit pytorch libtorch

5
推荐指数
1
解决办法
4786
查看次数

如何将张量列表转换为 torch::Tensor?

我正在尝试将以下 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)

那么有没有更好的方法来做到这一点呢?我们可以使用单行代码来完成此操作吗?

c++ torch libtorch

5
推荐指数
1
解决办法
2217
查看次数

从 Pytorch C++ 中的 c10::Dict&lt;c10::IValue, c10::IValue&gt; 获取值

我在 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)

c++ torch pytorch torchscript libtorch

5
推荐指数
1
解决办法
2633
查看次数

如何在 mac ARM 上构建 libtorch?

我下载了 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)

你能帮助我吗?

c++ macos arm libtorch

5
推荐指数
1
解决办法
4229
查看次数

如何获得 torch::张量形状

如果我们<<一个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++ pytorch libtorch

5
推荐指数
2
解决办法
1万
查看次数

在不使用“from_blob(...)...”的情况下从 C/C++ 数组创建一个 torch::Tensor

使用 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)

有没有更清洁的方法呢?

c++ pytorch libtorch

4
推荐指数
2
解决办法
7726
查看次数

在 Torch C++ API 中,如何快速写入张量的内部数据?

我正在使用 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)

有没有干净快速的方法来实现这个目标?

c++ pytorch libtorch

4
推荐指数
1
解决办法
1088
查看次数

为什么在 iOS 上使用 Caffe2 或 Core-ML 而不是 LibTorch(.pt 文件)?

似乎有几种方法可以在 iOS 上运行 Pytorch 模型。

  1. PyTorch(.pt) -> onnx -> caffe2
  2. PyTorch(.pt) -> onnx -> Core-ML (.mlmodel)
  3. PyTorch(.pt) -> LibTorch (.pt)
  4. PyTorch 移动版?

上述方法有什么区别?为什么人们使用 caffe2 或需要模型格式转换的 Core-ml (.mlmodel),而不是 LibTorch?

pytorch caffe2 coreml onnx libtorch

4
推荐指数
1
解决办法
415
查看次数

检查 torch::Tensor 是否为空的最佳方法是什么?

我目前正在使用该has_storage()方法来检查张量是否为空,但我想知道除此之外还有什么更好的方法!以及除了初始化torch::Tensor总是有一个存储而空的没有的事实之外,使用这个是否有任何影响!

c++ torch libtorch

4
推荐指数
1
解决办法
2899
查看次数

标签 统计

libtorch ×10

c++ ×9

pytorch ×7

torch ×3

arm ×1

caffe2 ×1

coreml ×1

jit ×1

macos ×1

onnx ×1

torchscript ×1