在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,这使得一个元素有多个索引引用它,正如警告所说:
存储的构造视图必须仅引用存储中的元素,否则将抛出运行时错误,并且如果视图是“重叠的”(多个索引引用内存中的同一元素),则其行为未定义。
特别地,它说对于上面的例子,其中元素有多个索引,行为是未定义的。
有没有一种方法可以使这种工作与记录,指定的行为?
2条答案
按热度按时间o0lyfsai1#
*torch.nn.unfold如何 * 从批量输入Tensor中提取滑动局部块。
文档在这里:https://pytorch.org/docs/stable/generated/torch.nn.Unfold.html
就像这样,我已经能够复制你在代码中显示的行为:
m4pnthwp2#
你可以使用PyTorch的
unfold
函数。下面是如何使用unfold
实现类似的结果: