Как объединить два слоя разных форм для ввода 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
).