python - 如何在 Keras2.0 中使用 'mask_zero=True' 连接 2 个嵌入层?
问题描述
我有两个嵌入层,一个已分配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
,我期望输出带有 size [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]
?为什么有另一个空张量被[]
输入到 Concatenate 中?
如果两个 Embedding 层都被分配mask_zero=True
或都被分配mask_zero=False
,它不会引发这个错误。如果它们在 处连接axis=2
,也不会引发此错误。
我的 keras 版本是 2.0.8。
谢谢你。
解决方案
因为mask_zero=True
在一种情况下,mask_zero=False
在另一种情况下,它在内部引起了一些问题(这不应该发生),也许这是一个错误,你可以在 Github 上报告它。
目前,我认为有效的 2 个选项是仅将其中一个用于两个嵌入: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)
推荐阅读
- sql - 我正在向 API 发送一个参数列表,比如 Medicine_name,参数列表将检查数据库并返回值
- python - 芹菜服务器错误:“不能将新设置名称与旧设置名称混合”
- flutter - 不使用 MaterialApp Flutter 在屏幕上添加按钮
- c++ - 确定当前 SECTION 的名称
- python - 删除 2d numpy 数组的备用列和行
- scala - 如何为猫效应的资源添加适当的错误处理
- regex - Regex_replace Postgres - 检查是否 <= 2 个字符长度
- sql - sql每天保存查询的行数
- php - PHP - 在错误的时间显示带有输入的警报
- swift - 如何在检测到的平面上移动虚拟对象