Pytorch的“折叠”和“展开”是如何工作的?

新手上路,请多包涵

我已经阅读了 官方文档。我很难理解此功能的用途及其工作原理。有人可以用外行的话解释一下吗?

原文由 shoshi 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 955
2 个回答

unfoldfold 用于促进“滑动窗口”操作(如卷积)。假设您要将函数 foo 应用到特征图/图像中的每个 5x5 窗口:

 from torch.nn import functional as f
windows = f.unfold(x, kernel_size=5)

Now windows has size of batch-(5 5 x.size(1) )-num_windows, you can apply foo on windows

 processed = foo(windows)

现在你需要“折叠” processed 回到原来的大小 x

 out = f.fold(processed, x.shape[-2:], kernel_size=5)

You need to take care of padding , and kernel_size that may affect your ability to “fold” back processed to the size of x .此外, fold 对重叠元素 _求和_,因此您可能希望将 fold 的输出除以补丁大小。


请注意 torch.unfold 执行的操作与 nn.Unfold 不同。有关详细信息,请参阅 此线程

原文由 Shai 发布,翻译遵循 CC BY-SA 4.0 许可协议

unfold 将张量想象成一个较长的张量,重复的列/行值“折叠”在彼此之上,然后“展开”:

  • size 确定折叠有多大
  • step 决定折叠的频率

例如,对于一个 2x5 张量,用 step=1 展开它,并修补 size=2 跨越 dim=1

 x = torch.tensor([[1,2,3,4,5],
                  [6,7,8,9,10]])
 >>> x.unfold(1,2,1)
tensor([[[ 1,  2], [ 2,  3], [ 3,  4], [ 4,  5]],
        [[ 6,  7], [ 7,  8], [ 8,  9], [ 9, 10]]])

在此处输入图像描述

fold 与此操作大致相反,但“重叠”值在输出中相加。

原文由 iacob 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题