PyTorch是否支持numpy.lib.stride_tricks.as_strided中的stride_tricks?

xzv2uavs  于 2023-10-19  发布在  其他
关注(0)|答案(2)|浏览(95)

在Numpy中,通过像这样改变数组的步幅,可以做出很酷的事情:

import numpy as np
from numpy.lib.stride_tricks import as_strided

a = np.arange(15).reshape(3,5)

print(a)
# [[ 0  1  2  3  4]
#  [ 5  6  7  8  9]
#  [10 11 12 13 14]]

b = as_strided(a, shape=(3,3,3), strides=(a.strides[-1],)+a.strides)

print(b)
# [[[ 0  1  2]
#   [ 5  6  7]
#   [10 11 12]]

#  [[ 1  2  3]
#   [ 6  7  8]
#   [11 12 13]]

#  [[ 2  3  4]
#   [ 7  8  9]
#   [12 13 14]]]

# Get 3x3 sums of a, for example
print(b.sum(axis=(1,2)))
# [54 63 72]

我在PyTorch中搜索了一个类似的方法,找到了as_strided,但它不支持strides,这使得一个元素有多个索引引用它,正如警告所说:
存储的构造视图必须仅引用存储中的元素,否则将抛出运行时错误,并且如果视图是“重叠的”(多个索引引用内存中的同一元素),则其行为未定义。
特别地,它说对于上面的例子,其中元素有多个索引,行为是未定义的。
有没有一种方法可以使这种工作与记录,指定的行为?

o0lyfsai

o0lyfsai1#

*torch.nn.unfold如何 * 从批量输入Tensor中提取滑动局部块。

文档在这里:https://pytorch.org/docs/stable/generated/torch.nn.Unfold.html
就像这样,我已经能够复制你在代码中显示的行为:

a = torch.arange(15).reshape(3, 5)

    print("Original tensor:")
    print(a)

    # Unfold the tensor to create a view with a specified size and step
    unfolded = a.unfold(1, 3, 1).unfold(0, 3, 1)

    print("\nUnfolded tensor:")
    print(unfolded)

    sums = unfolded.sum(dim=(2, 3))

    print("\n3x3 sums:")
    print(sums) # tensor([[54, 63, 72]])
  • 警告:目前仅支持4-D输入Tensor(批量图像状Tensor)。*
m4pnthwp

m4pnthwp2#

你可以使用PyTorch的unfold函数。下面是如何使用unfold实现类似的结果:

import torch

a = torch.arange(15).reshape(3, 5)

# Create a sliding window view of the tensor
window_size = (3, 3)
stride = 1  # Adjust the stride as needed
unfolded = a.unfold(0, window_size[0], stride).unfold(1, window_size[1], stride)

print(unfolded)

相关问题