Как преобразовать 5D-тензор в 4D-тензор, сохранив порядок последнего измерения, используя keras.layers.permutate и keras.layers.reshape - PullRequest
0 голосов
/ 18 марта 2020

Я пытаюсь изменить вывод слоя Kev Conv3D с 10 ядрами (output_dim = (None, 14, 14, 3, 10 )) в желаемый выход (None, 14, 14 , 30 , 1) чтобы я мог выполнить еще одну трехмерную свертку для всех ядер, вместе взятых. Я хочу сохранить пространственное соотношение / порядок предыдущих 10 ядер в измененном тензоре, например, вставив их «позади» друг друга.

Поскольку keras.layers.reshape использует стиль строки c * 'для изменения тензоров я бы потерял здесь порядок ядер. С готовностью существует исчерпывающее объяснение того, как использовать numpy .reshape с numpy .permutate для numpy матриц, и предположим, что keras будет работать аналогично, поскольку я также могу использовать keras.layers.permutate. Проблема в том, что я просто не могу разобраться, какая перестановка мне нужна в этом случае, прежде чем изменить форму с помощью keras.layers.reshape, чтобы сохранить порядок.

Интуиция и идея преобразования массива 4D в 2D массив в NumPy

Я всегда мог нарезать и объединять тензор, но это потребовало бы больше keras.layers и замедлило бы мою программу. Очень интересная комбинация keras.layers.Permutate () -> keras.layers.Reshape ()!

1 Ответ

0 голосов
/ 18 марта 2020

Изменение формы не должно изменять порядок чего-либо (потому что изменение порядка является вычислительно дорогим, а изменение формы просто говорит, как делить)

Лучший способ проверить это просто сделать это и посмотреть на результаты, но вы получите это:

Если вы измените это (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]...
...