Keras使用TokenAndPositionEmbedding层遇Paddings非负错误求助
问题分析与解决方案
错误根源
你遇到的ValueError核心原因是输入序列长度与TokenAndPositionEmbedding层指定的sequence_length不匹配:
- 你将4个形状为
(32,600)的输入拼接后,得到了长度为2400的序列(形状(32,2400)) - 但你在
TokenAndPositionEmbedding中设置了sequence_length=600,位置嵌入层会尝试生成适配600长度的位置编码,当输入序列长度(2400)远大于设定值时,内部的padding操作会出现负数,直接触发错误。
另外你的代码存在变量名错误:拼接后的变量是concatenate,但你传入层的是x,这会导致输入并非你预期的拼接后序列。
修复步骤
- 匹配序列长度:将
sequence_length改为拼接后的实际序列长度2400 - 修正输入变量:把层的输入从
x改为concatenate - (可选)如果后续模型有固定长度要求,可调整拼接逻辑或使用
keras.layers.Reshape/keras.layers.Cropping1D调整序列长度
修复后的代码示例
concatenate = keras.layers.concatenate(input_layers, axis=1) # 拼接后输出形状为(32, 2400),对应调整sequence_length为2400 x = keras_nlp.layers.TokenAndPositionEmbedding( vocabulary_size=20000, sequence_length=2400, # 修改为实际序列长度 embedding_dim=256, mask_zero=True, )(concatenate) # 传入正确的拼接后变量
额外验证
如果单独测试位置嵌入层,可直接传入(32,2400)的张量,设置sequence_length=2400,验证是否正常运行:
test_input = keras.Input(shape=(2400,)) pos_emb = keras_nlp.layers.PositionEmbedding(sequence_length=2400, embedding_dim=256)(test_input) model = keras.Model(inputs=test_input, outputs=pos_emb) print(model.predict(np.zeros((32,2400))).shape) # 应输出(32,2400,256)
内容的提问来源于stack exchange,提问作者Bonsai Noodle
相关产品推荐
相关产品推荐

