将 PyTorch 张量分割成重叠的块

Moh*_*afa 3 python pytorch tensor

给定一批形状为 (batch, c, h, w) 的图像,我想将其重塑为 (-1, 深度, c, h, w),使得大小为 d 的第 i 个“块”包含帧 i -> i+d。基本上,使用 .view(-1, d, c, h, w) 会将张量重塑为 d 大小的块,其中第一个图像的索引将是 d 的倍数,这不是我想要的。

标量示例:

如果原始张量类似于:

[1,2,3,4,5,6,7,8,9,10,11,12] and d is 2; 
Run Code Online (Sandbox Code Playgroud)

view()会返回:[[1,2],[3,4],[5,6],[7,8],[9,10],[11,12]];

但是,我想得到:

[[1,2],[2,3],[3,4],[4,5],[5,6],[6,7],[7,8],[8,9],[9,10],[10,11],[11,12]]
Run Code Online (Sandbox Code Playgroud)

我编写了这个函数来做到这一点:

def chunk_slicing(data, depth):
    output = []
    for i in range(data.shape[0] - depth+1):
        temp = data[i:i+depth]
        output.append(temp)
    return torch.Tensor(np.array([t.numpy() for t in output]))
Run Code Online (Sandbox Code Playgroud)

但是我需要一个可用作 PyTorch 模型一部分的函数,因为此函数会导致此错误:

RuntimeError: Can't call numpy() on Tensor that requires grad. Use tensor.detach().numpy() instead.
Run Code Online (Sandbox Code Playgroud)

I'm*_*hdi 5

IIUC,你需要torch.Tensor.unfold

import torch
x = torch.arange(1, 13)
x.unfold(dimension = 0,size = 2, step = 1)
Run Code Online (Sandbox Code Playgroud)
tensor([[ 1,  2],
        [ 2,  3],
        [ 3,  4],
        [ 4,  5],
        [ 5,  6],
        [ 6,  7],
        [ 7,  8],
        [ 8,  9],
        [ 9, 10],
        [10, 11],
        [11, 12]])
Run Code Online (Sandbox Code Playgroud)

size = 3另一个带有和 的例子step = 2

>>> torch.arange(1, 10).unfold(dimension = 0,size = 3, step = 2)

tensor([[1, 2, 3],  # window with size = 3
# step : ---1--2---
        [3, 4, 5],  # 'step = 2' so start from 3
        [5, 6, 7],
        [7, 8, 9]])
Run Code Online (Sandbox Code Playgroud)