5分类文本序列训练报错:目标数组形状(32,124403)与输出(None,5)不匹配
错误原因
- 核心问题为传入模型的标签形状与模型输出形状不匹配:你搭建的5分类模型最终输出维度是
(batch_size, 5),对应每个样本属于5个类别的概率;但报错显示你传入的标签形状为(32, 124403),二者维度完全不符。 - 124403是你设置的词汇表大小
num_unique_words,说明你错误地把文本输入的词序列当成了分类标签传入模型。 - 你调用
model.fit的参数逻辑存在问题:标准model.fit的前两个入参分别是输入特征x和对应标签y,你仅传入train_sequence作为第一个参数,要么是漏传了标签参数,要么是你构造的train_sequence数据集本身存在输入、标签顺序颠倒,或标签赋值错误的问题。
解决方案
- 第一步:整理正确的分类标签:每个样本对应一个5维的one-hot编码(适配你当前使用的
categorical_crossentropy损失),标签整体形状应为(总样本数, 5),单batch标签形状为(32, 5)。 - 第二步:修正
model.fit的传参逻辑:- 若你是手动拆分的输入和标签,将调用写法改为
model.fit(x=train_x, y=train_y, ...),其中train_x是训练文本序列,train_y是对应的5分类标签。 - 若你是用
tf.data.Dataset构造的数据集,检查数据集构造逻辑,保证每次迭代返回的是(输入序列, 5维标签)的元组,不要把输入序列当成标签返回。
- 若你是手动拆分的输入和标签,将调用写法改为
- 可选简化方案:如果你的标签是0~4的整数类别编码,不想做one-hot转换,可以直接修改损失函数为
sparse_categorical_crossentropy,无需调整模型结构,仅修改compile代码即可:
model.compile(loss='sparse_categorical_crossentropy', optimizer='sgd', metrics=['accuracy'])
调整后标签形状仅需为(样本数,)或(batch_size,)即可,无需额外做one-hot编码。
内容的提问来源于stack exchange,提问作者kareem20
相关产品推荐
相关产品推荐

