Keras Sequential模型处理标签shape为(3,)数据集时loss为nan问题求助
问题解决方案
核心错误原因
- 输出层激活函数与损失函数不匹配:回归任务下输出层使用了仅适用于分类任务的
softmax,该激活会强制输出和为1的概率值,搭配回归损失MSE会严重限制输出范围,直接导致数值计算异常出现nan - 全层使用线性激活:多层线性激活叠加等价于单层线性变换,无非线性拟合能力,且极易出现梯度爆炸/消失引发数值溢出
- 指标选择错误:
accuracy是分类任务专属指标,回归任务下该数值无参考意义,你当前得到的0.33准确率仅为随机匹配结果
修复代码
请先确认你的任务类型,对应选择适配代码:
场景1:回归任务(标签(3,)为任意连续数值,不需要概率输出)
model_Test_1 = tf.keras.Sequential([ tf.keras.layers.Conv2D(37, (1,1), padding='same', activation='relu', input_shape=(37,1,1)), tf.keras.layers.Conv2D(74, (2,1), padding='same', activation='relu'), tf.keras.layers.Flatten(), tf.keras.layers.Dense(147, activation='relu'), tf.keras.layers.Dense(3, activation='linear') ]) model_Test_1.compile(optimizer=tf.keras.optimizers.Adam(learning_rate=1e-4), loss= tf.keras.losses.MeanSquaredError(), metrics=['mae'] )
场景2:多分类任务(标签(3,)为one-hot编码的分类标签,取值仅为0/1)
model_Test_1 = tf.keras.Sequential([ tf.keras.layers.Conv2D(37, (1,1), padding='same', activation='relu', input_shape=(37,1,1)), tf.keras.layers.Conv2D(74, (2,1), padding='same', activation='relu'), tf.keras.layers.Flatten(), tf.keras.layers.Dense(147, activation='relu'), tf.keras.layers.Dense(3, activation='softmax') ]) model_Test_1.compile(optimizer=tf.keras.optimizers.Adam(learning_rate=1e-4), loss= tf.keras.losses.CategoricalCrossentropy(), metrics=['accuracy'] )
如果你的分类标签是整数形式(单值表示类别,shape为(1,)而非one-hot的(3,)),将损失函数替换为tf.keras.losses.SparseCategoricalCrossentropy()即可。
额外排查项
- 确认输入数据不存在
nan/无穷大值,归一化操作避免除0 - 如果修复后仍出现
nan,可在优化器中添加梯度裁剪:optimizer=tf.keras.optimizers.Adam(learning_rate=1e-4, clipvalue=1.0)
内容的提问来源于stack exchange,提问作者Noé Abdou
相关产品推荐
相关产品推荐

