Pytorch提供了torch.Tensor.unfold
操作,可以链接到任意多个维度以提取重叠的补丁。我们如何逆转补丁提取操作,使得补丁可以组合回输入形状?
重点是具有1个通道(生物医学)的3D体数据图像。使用unfold
可以提取补丁,如果这些补丁重叠,如何将它们组合起来?
回答:
为了提取(重叠)补丁并重建输入形状,我们可以使用torch.nn.functional.unfold
和其逆操作torch.nn.functional.fold
。这些方法只能处理4D张量或2D图像,但是您可以一次处理一个维度来使用这些方法。
几个注意事项:
-
这种方法需要使用来自pytorch的fold/unfold方法,不幸的是,我还没有在TF API中找到类似的方法。
-
我们从2D开始,然后是3D,然后是4D,以展示增量差异,您可以扩展到任意多个维度(可能编写一个循环而不是像我这样硬编码每个维度)
-
我们可以通过两种方式提取补丁,它们的输出是相同的。方法被称为
extract_patches_Xd
和extract_patches_Xds
,其中X是维度的数量。后者使用torch.Tensor.unfold(),代码行数更少。(输出是相同的,除了它不能使用膨胀) -
方法
extract_patches_Xd
和combine_patches_Xd
是逆方法,组合器一步一步地逆转提取器的步骤。 -
代码行后面跟随一个注释,声明维度如(B, C, T, D, H, W)。以下是使用的符号:
B
:批量大小C
:通道T
:时间维度D
:深度维度H
:高度维度W
:宽度维度x_dim_in
:在提取方法中,这是维度x
的输入像素数。在组合方法中,这是维度x
的滑动窗口数量。x_dim_out
:在提取方法中,这是维度x
的滑动窗口数量。在组合方法中,这是维度x
的输出像素数。
-
我有一个公开的笔记本可以尝试代码
-
我已经尝试了基本的2D、3D和4D张量,如下所示。然而,我的代码并非无懈可击,我希望在其他输入上测试时能得到反馈。
-
get_dim_blocks()
方法是pytorch文档网站上给出的函数,用于计算卷积层的输出形状。 -
请注意,如果您有重叠的补丁并且您将它们组合起来,重叠的元素将被求和。如果您想再次获得初始输入,有一种方法可以做到这一点。
- 使用
torch.ones_like(patches_tensor)
创建与补丁大小相似的全1张量。 - 将补丁组合成具有相同输出形状的完整图像。(这会为重叠元素创建一个计数器)。
- 用组合的全1张量除以组合的图像,这应该可以逆转任何元素的双重求和。
- 使用
首先(2D):
可以直接使用torch.nn.functional.fold
和torch.nn.functional.unfold
方法。
...
输出(2D)
...
其次(3D):
现在变得有趣了:我们需要使用两个fold
和unfold
,我们首先对D
维度应用fold
,并通过设置内核为1、填充为0、步长为1和膨胀为1来保持W
和H
不变。然后我们查看张量并对H
和W
维度进行折叠。展开操作以相反的顺序进行,首先是H
和W
,然后是D
。
...
输出(3D)
(我不得不限制字符数,请查看笔记本)
第三(4D)
我们在3D体数据中增加一个时间维度。我们从仅对T
维度进行折叠开始,类似于3D版本,保持D
、H
和W
不变。然后我们对D
进行折叠,保持H
和W
不变。最后我们对H
和W
进行折叠。展开操作再次以相反的顺序进行。希望您现在已经注意到一个模式,并且您可以添加任意多个维度,并开始一个接一个地折叠。展开操作再次以相反的顺序进行。
...
输出(4D)
(我不得不限制字符数,请查看笔记本)