2

我正在尝试为 C++ 类型的 Torch 创建一个掩码BoolTensorn维度中的第一个元素one需要是False,其余的需要是True

这是我的尝试,但我不知道这是否正确(大小是元素的数量):

src_mask = torch::BoolTensor({6, 1});
src_mask[:size,:] = 0;
src_mask[size:,:] = 1;
4

2 回答 2

0

我不确定是否完全理解您在这里的目标,所以这是我将您的伪代码转换为 C++ 的最佳尝试。

首先,使用 libtorch,您可以通过torch::TensorOptions结构声明张量的类型(类型名称以小写 k 为前缀)

其次,借助该功能,您可以进行类似 python 的切片torch::Tensor::slice(请参见此处此处)。

最后,这给了你类似的东西:

// Creates a tensor of boolean, initially all ones
auto options = torch::TensorOptions().dtype(torch::kBool));
torch::Tensor bool_tensor = torch::ones({6,1}, options);
// Set the slice to 0
int size = 3;
bool_tensor.slice(/*dim=*/0, /*start=*/0, /*end=*/size) = 0;

std::cout << bool_tensor << std::endl;

请注意,这会将第一size行设置为 0。我认为这就是您所说的“维度 x 中的第一个元素”的意思。

于 2020-07-31T17:14:09.303 回答
0

另一种方法:

using namespace torch::indexing; //for using Slice(...) function

at::Tensor src_mask = at::empty({ 6, 1 }, at::kBool); //empty bool tensor 
src_mask.index_put_({ Slice(None, size), Slice() }, 0); //src_mask[:size,:] = 0
src_mask.index_put_({ Slice(size, None), Slice() }, 1); //src_mask[size:,:] = 0
于 2021-01-19T01:03:48.733 回答