TensorFlow(keras)模型预测全部样本返回相同值问题求助
TensorFlow模型预测全部返回相同值问题排查方案
核心问题原因
- 输入形状配置错误
你在第一层全连接层设置的input_shape=x_train.shape是错误的,Dense层只需要接收特征维度作为输入形状,正确写法应为input_shape=(x_train.shape[1],)。你传入了包含样本数的完整维度,会导致模型结构匹配错误,无法正常学习特征规律。 - 任务与损失函数、输出层不匹配
你的需求是5分类任务(Valuable可选值为-2、-1、0、1、2),但当前代码用的是二分类的binary_crossentropy损失函数,输出层接sigmoid激活仅能输出0-1之间的二分类结果,完全不符合多分类任务要求,自然无法输出正确的多分类结果。 - 输入特征未做标准化处理
你的输入特征如Open、High等数值都在350左右的大区间,sigmoid激活函数在输入绝对值过大时会进入饱和区,梯度几乎为0,导致权重无法正常更新,最终所有神经元输出趋于一致,预测结果全部相同。 - 激活函数选型不合理
中间隐藏层全部使用sigmoid激活函数本身就容易出现梯度消失问题,层数较多时几乎无法完成深度网络的训练,建议替换为ReLU、LeakyReLU等激活函数。 - 训练配置不合理
1700条样本训练1000轮极容易出现过拟合,且你未设置验证集监控训练过程,无法提前感知模型训崩、过拟合等问题。
修复后示例代码
import pandas as pd import numpy as np import tensorflow as tf from sklearn.model_selection import train_test_split from sklearn.preprocessing import StandardScaler, LabelEncoder # 加载数据 dataset = pd.read_csv('BNB.csv') x = dataset.drop(columns=["Valuable"]) y = dataset["Valuable"] # 标签编码,把-2/-1/0/1/2转为0-4的整数标签 le = LabelEncoder() y = le.fit_transform(y) # 特征标准化 scaler = StandardScaler() x = scaler.fit_transform(x).astype('float32') # 拆分数据集 x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2, random_state=42) # 搭建模型 model = tf.keras.models.Sequential() model.add(tf.keras.layers.Dense(256, input_shape=(x_train.shape[1],), activation='relu')) model.add(tf.keras.layers.Dropout(0.3)) # 加dropout防止过拟合 model.add(tf.keras.layers.Dense(256, activation='relu')) model.add(tf.keras.layers.Dropout(0.3)) model.add(tf.keras.layers.Dense(5, activation='softmax')) # 5分类输出 # 编译模型 model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy']) # 训练模型,加入验证集监控 model.fit(x_train, y_train, epochs=100, validation_split=0.2) # 预测时输出分类结果 predictions = model.predict(x_test) predict_classes = le.inverse_transform(np.argmax(predictions, axis=1))
内容的提问来源于stack exchange,提问作者Renke Ludwig
相关产品推荐
相关产品推荐

