TensorFlow模型predict返回随机浮点数,未输出3类概率问题求助
问题描述
我的模型接收类似'USD'的输入并预测其类别,类别定义如下:
0=book name1=currency2=security number
训练、验证及测试集的结构示例如下:
Value Label 0 CAT_USD_CORP 0 1 USD 1 2 US348595EV89 2 3 ATTR_IRT_LDN_ISD_ISD 0 4 CAD 1 ...
我用以下代码训练并测试模型,运行正常且准确率良好:
model = tf.keras.Sequential([ feature_layer, layers.Dense(128, activation='relu'), layers.Dense(128, activation='relu'), layers.Dropout(.1), layers.Dense(1) ]) model.compile(optimizer='adam', loss=tf.keras.losses.BinaryCrossentropy(from_logits=True), metrics=['accuracy']) model.fit(train_ds, validation_data=val_ds, epochs=12) loss, accuracy = model.evaluate(test_ds) print("Accuracy", accuracy)
但输入值预测时,模型总是返回随机浮点数数组,而非三类类别的概率。例如:
model.predict(np.array(['USD']))返回array([[1195770.]], dtype=float32)model.predict(np.array(['US568A45EV89']))返回array([[1938599.4]], dtype=float32)
预期模型返回包含3个概率值的数组,对应三个类别的概率。
解决方案
问题出在模型的输出层配置和损失函数选择上,属于多分类任务的典型配置错误,修改步骤如下:
- 调整输出层结构
当前输出层仅1个神经元,对应二分类任务。需将输出层神经元数量改为3(匹配3个类别),并添加softmax激活函数,让输出的3个值成为总和为1的概率分布:
model = tf.keras.Sequential([ feature_layer, layers.Dense(128, activation='relu'), layers.Dense(128, activation='relu'), layers.Dropout(.1), layers.Dense(3, activation='softmax') # 修改:3个神经元 + softmax激活 ])
- 更换损失函数
多分类任务不能使用BinaryCrossentropy,需换成SparseCategoricalCrossentropy(因你的标签是整数形式,如0、1、2):
model.compile(optimizer='adam', loss=tf.keras.losses.SparseCategoricalCrossentropy(), metrics=['accuracy'])
若标签是one-hot编码形式,则用CategoricalCrossentropy,但根据数据集示例,标签为整数,SparseCategoricalCrossentropy更适配。
- 预测结果处理
修改后,model.predict(np.array(['USD']))会返回类似array([[0.01, 0.97, 0.02]], dtype=float32)的结果,三个值分别对应类别0、1、2的概率。若需直接得到预测的类别索引,可使用np.argmax():
pred_probs = model.predict(np.array(['USD'])) pred_class = np.argmax(pred_probs, axis=1) # 得到类别索引,如[1]
内容的提问来源于stack exchange,提问作者Daniel Wu
相关产品推荐
相关产品推荐

