我有两个嵌入层,一个分配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=True
或mask_zero=False
,则不会引发此错误。
如果它们在axis=2
连接,则也不会引发此错误。
我的keras版本是2.0.8。
谢谢。
答案 0 :(得分:1)
因为你在一个案例中有mask_zero=True
而在另一个案例中有mask_zero=False
而在内部导致了一些问题(这不应该发生),也许这是一个错误,你可以在Github上报告。
目前我认为有两个选项可以同时使用其中一个嵌入:mask_zero=True
或mask_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)