Как применить свертку к последним трем измерениям тензора 5D с помощью Conv2D в Keras?

Обычно входной тензор Conv2D в Keras представляет собой 4D-тензор с размерностью batch_size * n * n * channel_size. Теперь у меня есть тензор 5D с размером batch_size * N * n * n * channel_size, и я хочу применить сверточный слой 2D для последних трех измерений для каждого i в N. Например, если размер ядра равен 1, то я ожидаю, что результат будет иметь размер batch_size * N * n * n * 1.

Кто-нибудь знает несколько простых способов реализовать это с помощью Keras?

Например, для полностью подключенного слоя Keras может сделать это автоматически. Если вход имеет форму batch_size * N * n, то слой Dense в Keras установит слой FC для каждого i в N. Следовательно, мы получим результат с batch_size * N * m, если мы установим Dense(m).


person Z. Ye    schedule 07.01.2019    source источник


Ответы (1)


Вы можете использовать оболочку слоя TimeDistributed, чтобы применить один и тот же слой свертки ко всем изображениям в 5D тензор. Например:

model = Sequential()
model.add(TimeDistributed(Conv2D(5, (3,3), padding='same'), input_shape=(10, 100, 100, 3)))

model.summary()

Краткое описание модели:

Layer (type)                 Output Shape              Param #   
=================================================================
time_distributed_2 (TimeDist (None, 10, 100, 100, 5)   140       
=================================================================
Total params: 140
Trainable params: 140
Non-trainable params: 0
_________________________________________________________________
person today    schedule 07.01.2019
comment
Очень быстрый ответ! Я сейчас попробую :) - person Z. Ye; 07.01.2019
comment
Это действительно работает, но не совсем так, как я ожидал. Кажется, что веса одинаковы для каждого временного параметра i в N. Однако я хотел установить разные веса для каждого i. - person Z. Ye; 07.01.2019
comment
@ Z.Ye Конечно, и я упомянул об этом в своем ответе. Кроме того, это также относится к приведенному вами примеру слоя Dense, т.е. веса фиксированы. Если вам нужны разные веса и N известен, вы можете легко написать для этого цикл for. - person today; 07.01.2019
comment
Да ты прав. Слой Dense также сделал то, что вы описали. Потом попробую петлю. - person Z. Ye; 07.01.2019
comment
Извините, что не могу проголосовать за ваш ответ. Я немного попробовал цикл for, но он не сработал. Я разместил вопрос здесь stackoverflow.com/questions/54093755/. Не могли бы вы мне намекнуть? Большое тебе спасибо. - person Z. Ye; 08.01.2019