I am trying to perform a multi dimensional slice operation on a Tensor to obtain a ROI using the following code:
// Image resolution is 800x600
cv::Mat img = cv::imread("test.png");
auto img_tensor = torch::from_blob(img.data, {img.cols, img.rows, 3}, torch::kByte);
auto slice_tensor = img_tensor.index({
	torch::indexing::Slice(0, img.cols/2),
	torch::indexing::Slice(0, img.rows/2),
	torch::indexing::Slice()
}).contiguous(); // contiguous is required to copy the raw data to a Mat and write it to a png.

cv::Mat image_as_mat(cv::Size(slice_tensor.size(0),slice_tensor.size(1)),CV_8UC3, slice_tensor.data_ptr());
cv::imwrite("slice_img.png", image_as_mat);

From what I can tell, this is correct, but the result is not as expected:
pt_forum1201×600 4.96 KB
If the slice is set to the same size as the image, the output image is exactly the same. Which I assume is due to optimisations skipping slicing code. If the slice is changed to:
auto slice_tensor = img_tensor.index({
	torch::indexing::Slice(0, img.cols-1),
	torch::indexing::Slice(0, img.rows),
	torch::indexing::Slice()
}).contiguous();

The output image is corrupted like the output slice in the image above (but a different pattern).
Interestingly if I try slicing a smaller amount of data, it works as expected:
auto test = torch::arange(3*6*6).reshape(3, 6, 6});
auto slice = test.index({
	torch::indexing::Slice(),
	torch::indexing::Slice(0, 3),
	torch::indexing::Slice(0, 3)
}).contiguous();
std::cout << "test: " << test << std::endl;
std::cout << "slice: " << slice << std::endl;

Outputs:
test: (1,.,.) =
   0   1   2   3   4   5
   6   7   8   9  10  11
  12  13  14  15  16  17
  18  19  20  21  22  23
  24  25  26  27  28  29
  30  31  32  33  34  35

(2,.,.) =
  36  37  38  39  40  41
  42  43  44  45  46  47
  48  49  50  51  52  53
  54  55  56  57  58  59
  60  61  62  63  64  65
  66  67  68  69  70  71

(3,.,.) =
   72   73   74   75   76   77
   78   79   80   81   82   83
   84   85   86   87   88   89
   90   91   92   93   94   95
   96   97   98   99  100  101
  102  103  104  105  106  107
[ CPULongType{3,6,6} ]
slice: (1,.,.) =
   0   1   2
   6   7   8
  12  13  14

(2,.,.) =
  36  37  38
  42  43  44
  48  49  50

(3,.,.) =
  72  73  74
  78  79  80
  84  85  86
[ CPULongType{3,3,3} ]

Am I missing something? I’m really at a loss as to what the issue might be.
Environment:
libtorch: v1.6 CPU (downloaded pre built binaries, but also built locally for a debug build)
os: windows 10 x64
compiler: msvc v16.7.5 x64