TensorFlow CNN处理SBERT句嵌入数据时形状不匹配问题咨询
问题根因
报错来源于两处核心配置和数据/任务不匹配:
- 输入配置错误:你已经提前通过SBERT生成了每个句子的384维嵌入,单样本形状为
(439, 384),但原有代码定义的输入层仅接收(439,)的整数ID序列,还额外新增了Embedding层做二次嵌入,冗余操作直接导致维度错乱。 - 输出层配置错误:你的目标是二分类任务,但原有代码输出层设置了274个神经元的softmax激活,对应274分类任务,和需求不符。
需调整的配置项
- 移除冗余的Embedding层,修改输入层形状为
(439, 384),匹配现有SBERT嵌入的格式 - 直接对输入张量增加通道维度适配Conv2D的输入要求
- 调整输出层和损失函数适配二分类:如果标签是0/1格式,输出层用1个神经元+
sigmoid激活,损失函数改为binary_crossentropy;如果标签是独热编码格式,输出层用2个神经元+softmax激活,保留原损失函数即可
修改后可运行的代码
from tensorflow.keras import layers, optimizers, Model # 调整输入层形状,匹配SBERT嵌入格式 sequence_input = layers.Input(shape=(439, 384)) # 直接增加通道维度适配Conv2D,不需要Embedding层 embedded_sequences = layers.Reshape((439, 384, 1))(sequence_input) # 原有卷积池化逻辑保留 x = layers.Conv2D(100, (5, 384), activation='relu')(embedded_sequences) x = layers.MaxPooling2D((439 - 5 + 1, 1))(x) y = layers.Conv2D(100, (4, 384), activation='relu')(embedded_sequences) y = layers.MaxPooling2D((439 - 4 + 1, 1))(y) z = layers.Conv2D(100, (3, 384), activation='relu')(embedded_sequences) z = layers.MaxPooling2D((439 - 3 + 1, 1))(z) alpha = layers.concatenate([x,y,z]) alpha = layers.Flatten()(alpha) alpha = layers.Dropout(0.5)(alpha) # 调整输出层适配二分类(这里以0/1标签格式为例) preds = layers.Dense(1, activation='sigmoid')(alpha) model = Model(sequence_input, preds) adadelta = optimizers.Adadelta() # 损失函数对应调整为二分类交叉熵 model.compile(loss='binary_crossentropy', optimizer=adadelta, metrics=['acc']) model.fit(x=X_train_sent_emb_3m, y=y_train_sent_emb_3m, epochs=25 , validation_data=(X_test_sent_emb_3m, y_test_sent_emb_3m))
内容的提问来源于stack exchange,提问作者gschweer84
相关产品推荐
相关产品推荐

