我正在尝试将具有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()的“花哨”组合!
重塑不应该改变任何东西的顺序(因为改变顺序在计算上是昂贵的,而重塑只是告诉如何分割)
最好的测试方法是简单地做一下,然后看一下结果,但是您会得到这些的:
如果您重塑此(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]...