TensorFlow Keras函数式模型报形状不兼容错误如何解决?
问题解决方案
报错原因
你在函数式实现中第二层Bidirectional(LSTM)层的return_sequences参数设置错误:
- 顺序模型中该参数为
False,LSTM仅返回最后一个时间步的输出,形状为(batch_size, 400),经过Dense层后输出(batch_size, 22),和你的意图标签形状完全匹配 - 函数式实现中该参数被误设为
True,LSTM会返回所有11个时间步的输出,形状为(batch_size, 11, 400),经过Dense层后输出(batch_size, 11, 22),和形状为(batch_size, 22)的标签无法匹配,触发维度报错。
修复方案
方案1:对齐顺序模型逻辑(适合仅需句子级意图分类场景)
直接将第二层BiLSTM的return_sequences参数改为False即可,修改后代码如下:
input_layer = layers.Input(shape=(limit_on_length,)) # 也可保留None,固定长度写死更稳妥 x = layers.Embedding(vocab_size, embedding_dim, weights=[embedding_matrix], input_length=limit_on_length, trainable=False)(input_layer) x = layers.Conv1D(50, 4, padding='same', activation='relu')(x) x = layers.Bidirectional(layers.LSTM(units=200, return_sequences=True, dropout=0.2, recurrent_dropout=0.2))(x) # 仅修改此处return_sequences为False,和顺序模型逻辑对齐 x = layers.Bidirectional(layers.LSTM(units=200, return_sequences=False, dropout=0.2, recurrent_dropout=0.2))(x) intents_out = layers.Dense(n_intents, activation='softmax')(x) model = models.Model(input_layer, intents_out) model.compile(optimizer='rmsprop', loss='categorical_crossentropy', metrics=["accuracy"])
方案2:保留序列输出适配多输出场景(适合需要新增其他序列级输出的需求)
如果你的额外输出层需要用到每个时间步的特征,可以保留第二层BiLSTM的return_sequences=True,单独给意图分类分支增加全局池化层压缩维度,同时保留序列特征给其他输出分支,示例代码如下:
input_layer = layers.Input(shape=(limit_on_length,)) x = layers.Embedding(vocab_size, embedding_dim, weights=[embedding_matrix], input_length=limit_on_length, trainable=False)(input_layer) x = layers.Conv1D(50, 4, padding='same', activation='relu')(x) x = layers.Bidirectional(layers.LSTM(units=200, return_sequences=True, dropout=0.2, recurrent_dropout=0.2))(x) seq_feature = layers.Bidirectional(layers.LSTM(units=200, return_sequences=True, dropout=0.2, recurrent_dropout=0.2))(x) # 意图分类分支:加全局池化将三维特征转为二维,匹配标签形状 intent_x = layers.GlobalAveragePooling1D()(seq_feature) intents_out = layers.Dense(n_intents, activation='softmax', name='intent_out')(intent_x) # 此处可新增其他需要序列特征的输出分支,比如序列标注、实体识别等 # other_out = layers.Dense(other_class_num, activation='sigmoid', name='other_out')(seq_feature) # 多输出模型定义,有多个输出直接添加到列表即可 model = models.Model(input_layer, [intents_out]) # 多输出训练可按分支名称单独指定损失、权重、评估指标 model.compile(optimizer='rmsprop', loss={'intent_out': 'categorical_crossentropy'}, metrics={'intent_out': 'accuracy'})
内容的提问来源于stack exchange,提问作者Abolfazl
相关产品推荐
相关产品推荐

