[英]How to reshape 5D tensor to a 4D tensor, preserving the order of the last dimension, using keras.layers.permutate and keras.layers.reshape
我正在尝试将具有 10 个内核的 keras Conv3D 层的输出 (output_dim = (None, 14, 14, 3, 10 )) 重塑为所需的 (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() 的“奇特”组合将不胜感激!
重塑不应该改变任何东西的顺序(因为改变顺序在计算上是昂贵的,而重塑只是告诉如何划分)
最好的测试方法是简单地进行测试并查看结果,但您会得到以下结果:
如果你重塑这个(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]...
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.