首页 > 解决方案 > 如何使用 keras.layers.permutate 和 keras.layers.reshape 将 5D 张量重塑为 4D 张量,保留最后一维的顺序

问题描述

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

由于 keras.layers.reshape 使用 'row-major c-style' 来重塑张量,我会在这里放松内核的顺序。关于如何将 numpy.reshape 和 numpy.permutate 用于 numpy 矩阵,很容易有一个全面的解释,并假设 keras 将类似地工作,因为我也可以使用 keras.layers.permutate。问题是,在用 keras.layers.reshape 重塑以保留顺序之前,我根本无法理解在这种情况下我需要什么排列。

在 NumPy 中将 4D 数组重塑为 2D 数组背后的直觉和想法

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

标签: pythontensorflowkeraspermutationreshape

解决方案


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

最好的测试方法是简单地做它并查看结果,但你会得到这些:

如果你重塑这个(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]...

推荐阅读