我想在网络中合并2个不同层的输出,如下所示:
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 ...
您能举一些例子和/或参考吗?
答案 0 :(得分: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
)。