如何使用keras.layers.permutate和keras.layers.reshape将5D张量整形为4D张量,保留最后一个维度的顺序

问题描述 投票:0回答:1

我正在尝试将具有10个内核(output_dim =(None,14,14,14,3,10)的keras Conv3D层的输出重塑为所需的(None,14,14,14, 30,1),这样我就可以对所有合并的内核执行另一个3D卷积。我想在重塑张量中保留前10个内核的空间关系/顺序,就像将它们“彼此”粘贴在后面。

由于keras.layers.reshape使用'行主要的c样式'来重塑张量,因此我在这里放宽了内核的顺序。关于如何将numpy.reshape和numpy.permutate用于numpy矩阵,已经存在一个全面的解释,并且由于我也可以使用keras.layers.permutate,因此假设keras的工作原理类似。问题是,在使用keras.layers.reshape重塑形状以保留顺序之前,我根本无法理解这种情况下需要的排列方式。

Intuition and idea behind reshaping 4D array to 2D array in NumPy

我总是可以对张量进行切片和连接,但这将需要更多的keras.layers并减慢我的程序的速度。非常喜欢keras.layers.Permutate()-> keras.layers.Reshape()的“花哨”组合!

python tensorflow keras permutation reshape
1个回答
0
投票

重塑不应该改变任何东西的顺序(因为改变顺序在计算上是昂贵的,而重塑只是告诉如何分割)

最好的测试方法是简单地做一下,然后看一下结果,但是您会得到这些的:

如果您重塑此(2,5)

[
 [1,2,3,4,5],
 [6,7,8,9,10]
]

进入(10,),您将获得与以前相同的顺序:

[1,2,3,4,5,6,7,8,9,10]

如果出于某些原因想要[1,6,2,7,3,8,4,9,5,10],则需要置换最后两个维度。

也就是说,当您将(None, 14, 14, 3, 10)调整为(None, 14, 14, 30)时,会将最后10个的顺序保持在一起。

[[1,2,3,4,5,6,7,8,9,10],
 [11,12,13,14,15,16,17,18,19,20],
 [21,22,23,24,25,26,27,28,29,30]]

becomes

 [1,2,3,4,5,6,7,8,9,10,11,12...]

如果您想获得以下内容,然后进行置换:

outs = Permute((1,2,4,3))(ins)
outs = Reshape((14,14,30))(outs)
---> [[1,11,21], [2,12,22], [3,13,23]...
© www.soinside.com 2019 - 2024. All rights reserved.