TensorFlow分类模型标签加载异常,设置3类softmax层报形状不兼容错误
报错原因
核心问题是标签格式、取值与损失函数要求不匹配,和vectorize_text函数的文本处理逻辑无关:
- 你使用的
categorical_crossentropy损失要求标签为独热编码格式(shape为(样本数, 3)),但当前输入的标签是1/2/3的整数,shape为(样本数, 1),二者维度不匹配触发报错。 - 3分类任务的类别标签需要从0开始取值(0/1/2),当前标签为1/2/3,超出了输出层的索引范围,即使维度匹配也会出现计算错误。
解决方案
有两种可直接落地的修复方案,推荐选择方案1,改动最小:
方案1:替换损失函数+修正标签取值
- 修正标签取值,在生成
df_train_bogus后添加一行代码,将标签转为0/1/2:
df_train_bogus['labels'] = df_train_bogus['labels'] - 1
- 替换模型编译时的损失函数为
sparse_categorical_crossentropy,该损失原生支持整数标签,无需做独热编码:
model.compile(loss="sparse_categorical_crossentropy", optimizer="adam", metrics=["accuracy"])
方案2:保持原损失函数,对标签做独热编码
如果需要保留categorical_crossentropy,可对标签做独热转换适配:
- 同样先执行标签减1操作,修正取值范围为0/1/2
- 修改
vectorize_text函数,对标签做独热编码:
def vectorize_text(text, labels): text = tf.expand_dims(text, -1) labels = tf.one_hot(labels, depth=3) return vectorize_layer(text), labels
内容的提问来源于stack exchange,提问作者Yossi
相关产品推荐
相关产品推荐

