Help us understand the problem. What is going on with this article?

LibTorch(PyTorch C++)APIメモ

ほぼ自分用です。随時更新します。
LibTorch環境構築はこの記事を参照。

公式資料が有能なので、まずはそこをチェック。

float型vectorから1次元torch::Tensorへの変換

torch::Tensor tsr = torch::tensor(torch::ArrayRef<float>(vec));

torch::Tensor型vectorから2次元torch::Tensorへの変換

torch::Tensor tsr = torch::stack(tsr_vec);

1次元torch::Tensorのスライス

参考:https://pytorch.org/cppdocs/notes/tensor_indexing.html

namespace ti = torch::indexing;
torch::Tensor tsr2 = tsr.index({ ti::Slice(i, i + slice_size) });

1次元生配列からtorch::Tensorへの変換

// おそらく生配列でなくとも変換可能
// 先頭ポインタ、サイズ、型が分かっており、メモリ上に連続に配置されていればOK?
float raw_arr[] = {1.f, 2.f, 3.f};
torch::Tensor tsr = torch::from_blob(raw_arr/*先頭ポインタ*/, 3/*size*/, torch::TensorOptions().dtype(torch::kFloat32));

GPU使用可能かチェック

torch::DeviceType device_type;
if (torch::cuda::is_available()) {
    std::cout << "CUDA available! Running on GPU.\n";
    device_type = torch::kCUDA;
}
else {
    std::cout << "Running on CPU.\n";
    device_type = torch::kCPU;
}

CPU/GPUへ送る & 型変換

auto model = std::make_shared<Model>();
model->to(torch::kCUDA); // torch::Device型でなくても良い。
model->to(torch::kCPU);

tsr.to(torch::kFloat64);
tsr.to(torch::kCUDA);

tensorサイズ取得

size_t tsr_size = tsr.size(0 /*dim*/);
c10::IntArrayRef tsr_sizes = tsr.sizes();

torch::Tensorから組み込み型の値を取得

// tsrがスカラーでないとエラーを吐くので注意。
// 配列を変換したい場合、tsr.index({i})やtsr[i]で要素にアクセスしてから変換。
double d = tsr.item().toDouble();

その他

  • torch::Tensorは微分可能、at::Tensorは微分不可(らしい)
    • 両者に速度の違いはほとんどないため、基本的にtorch::Tensorを使う
  • torch_cuda.dllが見つからないエラー
    • 作成したexeと同じ場所に、cudaとtorch関連のDLLをコピーしてきたか?
  • カスタムデータローダーをインスタンス化できないエラー
kai_ware
学生です。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away