使用Google Colab与TensorFlow构建分类模型时.predict方法输出异常
问题分析与修正方案
1. 核心问题拆解
你的代码存在三个关键问题,导致predict输出异常且不符合预期:
- 最后一层输出维度与激活函数不匹配:单神经元用
softmax必然输出1.0,因为softmax会将单值归一化为总和1 - 标签格式未适配模型要求:原标签是1和4,未转换成模型可识别的0/1或对应编码格式
- 损失函数与模型输出逻辑不匹配:当前损失函数和输出层的组合无法实现双类别概率输出
2. 修正方案(实现双类别概率输出)
以下是贴合你需求的完整修正步骤:
步骤1:调整标签格式
将原标签1和4映射为0和1(对应模型输出的两个索引,后续可反向映射回原类别):
labels = labels.map({1: 0, 4: 1})
步骤2:修正模型结构与编译参数
把最后一层改成2个神经元+softmax激活,搭配适配整数标签的损失函数:
model = tf.keras.Sequential([ tf.keras.layers.Dense(256, activation='tanh', input_shape=(82,)), tf.keras.layers.Dense(2, activation='tanh'), # 自动继承上一层维度,无需手动指定input_shape tf.keras.layers.Dense(2, activation='softmax') # 2个神经元对应两个类别的概率输出 ]) # 使用sparse_categorical_crossentropy,适配整数类型的标签 model.compile(loss='sparse_categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
步骤3:训练与预测解析
增加训练轮次让模型充分学习,预测后将输出映射回原类别:
# 增加epochs,加入验证集监控训练效果 model.fit(x=features, y=labels, shuffle=True, epochs=20, validation_split=0.2) # 预测并解析结果 predictions = model.predict(features) for pred in predictions: # 索引0对应原类别1,索引1对应原类别4 print(f"1: {pred[0]:.2f}, 4: {pred[1]:.2f}")
额外注意事项
- 数据切片
df.iloc[1:, 1:]会跳过第一行数据,确认你的表头是否在第一行,若第一行是有效数据,需改为df.iloc[:, 1:] - 若不想修改标签,可保留原标签1和4,只需将损失函数改为
categorical_crossentropy,同时对标签做one-hot编码:labels = tf.keras.utils.to_categorical(labels - 1, num_classes=2) # 减1让标签变为0和1,再转one-hot model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
内容的提问来源于stack exchange,提问作者akozel
相关产品推荐
相关产品推荐

