如何连接2在Keras2.0中使用'mask_zero = True'嵌入图层?

时间:2018-05-04 02:48:09

标签: python keras embedding masking

我有两个嵌入层,一个分配mask_zero=True,另一个不分配,如下所示。

a = Input(shape=[30])
b = Input(shape=[30])
emb_a = Embedding(10, 5, mask_zero=True)(a)
emb_b = Embedding(20, 5, mask_zero=False)(b)
cat = Concatenate(axis=1)([emb_a, emb_b]) # problem here
model = Model(inputs=[a, b], outputs=[cat])

当我尝试在axis=1处连接它们时,我期望输出大小为[None, 60, 5],但它引发了错误:

ValueError: Dimension 0 in both shapes must be equal, but are 1 and 5.
Shapes are [1] and [5]. for 'concatenate_1/concat_1' (op: 'ConcatV2') with input shapes: 
[?,30,1], [?,30,5], [] and with computed input tensors: input[2] = <1>.

为什么emb_a的形状变为[None, 30, 1]?为什么还有另一个空张量[]进入连接?

如果两个嵌入图层都分配了mask_zero=Truemask_zero=False,则不会引发此错误。 如果它们在axis=2连接,则也不会引发此错误。

我的keras版本是2.0.8。

谢谢。

1 个答案:

答案 0 :(得分:1)

因为你在一个案例中有mask_zero=True而在另一个案例中有mask_zero=False而在内部导致了一些问题(这不应该发生),也许这是一个错误,你可以在Github上报告。

目前我认为有两个选项可以同时使用其中一个嵌入:mask_zero=Truemask_zero=False

a = Input(shape=[30])
b = Input(shape=[30])
emb_a = Embedding(10, 5)(a)
emb_b = Embedding(20, 5)(b)
cat = Concatenate(axis=1)([emb_a, emb_b])
model = Model(inputs=[a, b], outputs=[cat])

print(model.output_shape) # (None, 60, 5)

解决此问题的另一种方法是在axis=-1

上连接
a = Input(shape=[30])
b = Input(shape=[30])
emb_a = Embedding(10, 5, mask_zero=True)(a)
emb_b = Embedding(20, 5, mask_zero=False)(b)
cat = Concatenate()([emb_a, emb_b]) # problem here
model = Model(inputs=[a, b], outputs=[cat])

print(model.output_shape) # (None, 30, 10)