Как объединить два слоя разных форм для ввода LSTM? - PullRequest
0 голосов
/ 25 января 2019

Я хотел бы объединить выходы 2 разных слоев в моей сети следующим образом:

l1.shape
TensorShape([Dimension(None), Dimension(10), Dimension(100)])
l2.shape
TensorShape([Dimension(None), Dimension(20), Dimension(30)])

Я хотел бы объединить слои l1 и l2, а затем подать их наСлой LSTM.Я пробовал слой "Конкатенация", но он не работает.Я хочу что-то, что может заполнить слой с более низким последним измерением, чтобы получить то же измерение, что и другой слой.то есть: заполнив последнее измерение l2 two, получим следующее:

l2_padded = some_function(l2, axis=-1, dim=l1.shape[-1])
l2_padded.shape
TensorShape([Dimension(None), Dimension(20), Dimension(100)])

Затем выполните объединение,

c = Concatenate(axis=1)([l1, l2_padded])
c.shape
TensorShape([Dimension(None), Dimension(30), Dimension(100)])
bilstm = Bidirectional(LSTM(100))(c)
# other layers ...

Не могли бы вы привести пример и / или ссылки?

1 Ответ

0 голосов
/ 25 января 2019

Вы можете использовать комбинацию reshape и ZeroPadding1D:

import tensorflow.keras.backend as K
from tensorflow.keras.layers import ZeroPadding1D

x1 = Input(shape=(10, 100))
x2 = Input(shape=(20, 30))
x2_padded = K.reshape(
    ZeroPadding1D((0, x1.shape[2] - x2.shape[2]))(
        K.reshape(x2, (-1, x2.shape[2], x2.shape[1]))
    ),
    (-1, x2.shape[1], x1.shape[2])
)

Это выглядит немного неуклюже, но, к сожалению, ZeroPadding1D нене допускает указание оси отступа и всегда будет использовать axis=1.То же самое для K.transpose, который, в отличие от Numpy, не позволяет указать оси, которые следует поменять местами (следовательно, используя reshape).

...