Как объединить два слоя разных форм для ввода LSTM?

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

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

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

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 ответ

Решение

Вы можете использовать комбинацию 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).

Другие вопросы по тегам