TensorFlow模型训练异常:误差收敛至恒定值且预测结果异常
问题分析与修正方案
核心错误点
- 输入形状定义错误:你的输入是每个样本为4维向量(比如
[1,1,1,1]),但设置了input_shape=(4, 1),这会让模型认为每个样本是4行1列的二维张量,导致后续维度混乱,最终输出多余的维度。正确的输入形状应该是(4,),对应一维的4特征样本。 - 模型结构维度不匹配:输入形状错误引发连锁反应,使得模型的输出维度不符合预期,同时relu激活在这个简单任务里可能没必要,反而阻碍学习(因为输入都是正数,relu不会截断,但小样本下简化结构更好)。
- 损失函数与任务匹配问题:虽然你把标签设为0-3可以用MSE回归,但样本量极小(仅4个),加上结构错误导致模型无法学到输入和标签的映射关系,最终只能输出所有标签的均值((0+1+2+3)/4=1.5),所以误差固定在1.25(计算:((0-1.5)²+(1-1.5)²+(2-1.5)²+(3-1.5)²)/4 = (2.25+0.25+0.25+2.25)/4=5/4=1.25)。
修正后的代码
import numpy as np import tensorflow as tf from tensorflow.keras import layers, models # 数据和标签保持不变 data = np.array([[1,1,1,1], [2,2,2,2], [3,3,3,3], [4,4,4,4]]) labels = np.array([0, 1, 2, 3]) # 修正模型结构:输入形状改为(4,),简化线性层结构 model = models.Sequential() # 小样本下无需relu,直接用线性层即可学习简单映射 model.add(layers.Dense(1, input_shape=(4,))) # 保持MSE损失(此任务本质是向量到连续标签的映射,用回归损失合理) model.compile(optimizer='adam', loss=tf.keras.losses.MeanSquaredError(), metrics=['MeanSquaredError']) # 样本量小,无需1000轮训练,500轮足够收敛 model.fit(data, labels, epochs=500, verbose=1) # 预测测试,输出单个标签值 print(model.predict(np.array([[1,1,1,1]]), verbose=0)) # 接近0 print(model.predict(np.array([[2,2,2,2]]), verbose=0)) # 接近1 print(model.predict(np.array([[3,3,3,3]]), verbose=0)) # 接近2 print(model.predict(np.array([[4,4,4,4]]), verbose=0)) # 接近3
分类任务版本(可选)
如果要严格按分类任务处理(标签为类别0-3),可调整输出层和损失函数,将标签转为one-hot编码:
# 转换标签为one-hot格式 labels_onehot = tf.keras.utils.to_categorical(labels, num_classes=4) model = models.Sequential() model.add(layers.Dense(4, input_shape=(4,), activation='relu')) model.add(layers.Dense(4, activation='softmax')) model.compile(optimizer='adam', loss=tf.keras.losses.CategoricalCrossentropy(), metrics=['accuracy']) model.fit(data, labels_onehot, epochs=500, verbose=1) # 预测时取概率最大的类别索引 preds = model.predict(np.array([[1,1,1,1]]), verbose=0) print(np.argmax(preds)) # 输出0
内容的提问来源于stack exchange,提问作者user10889578
相关产品推荐
相关产品推荐

