为什么我的TensorFlow Sequential模型输出NaN?请帮忙排查原因
解决TensorFlow模型输出NaN的问题
问题根源
你的代码存在几个关键错误,导致模型输出NaN:
- 损失函数与指标不匹配:输出层用
sigmoid激活,属于二分类任务,但你用了适用于多分类的SparseCategoricalCrossentropy损失和对应指标,且设置了from_logits=True(但输出已经是经过sigmoid的概率,不是logits),这会导致损失计算异常。 - 样本数据单一:只有1个训练样本且标签全为1,模型没有正负样本对比,无法有效学习,损失计算时容易出现NaN。
- 无限循环重复训练:
While True会无限重复创建模型并训练同一批数据,加重数值不稳定问题。 - 导入不统一:代码混用
tf.keras和keras,可能导致模块引用错误。
修正后的代码
import tensorflow as tf from tensorflow import keras # 定义模型 def create_model(): model = tf.keras.Sequential([ keras.layers.Dense(30, activation='relu', input_shape=(30,)), keras.layers.Dense(12, activation='relu'), keras.layers.Dropout(0.2), keras.layers.Dense(7, activation='relu'), keras.layers.Dense(1, activation='sigmoid') ]) # 二分类任务使用BinaryCrossentropy损失,输出是sigmoid后的概率,from_logits设为False model.compile(optimizer='adam', loss=tf.keras.losses.BinaryCrossentropy(from_logits=False), metrics=[tf.keras.metrics.BinaryAccuracy()]) return model # 创建模型实例 model = create_model() model.summary() # 构造包含正负样本的数据集(示例) train_labels = [1, 0] test_labels = [1, 0] train_images = [ [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30], [30,29,28,27,26,25,24,23,22,21,20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1] ] test_images = [ [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30], [30,29,28,27,26,25,24,23,22,21,20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1] ] # 训练模型 model.fit(train_images, train_labels, epochs=10, validation_data=(test_images, test_labels), verbose=1) # 预测 print('predicted:', model.predict(train_images))
关键调整说明
- 替换损失与指标:改用
BinaryCrossentropy损失和BinaryAccuracy指标,匹配二分类任务,同时from_logits设为False(因为输出层用了sigmoid激活)。 - 增加多样本:添加正负样本,让模型有学习的依据,避免损失计算异常。
- 移除无限循环:去掉
While True,避免重复创建模型和无意义的重复训练。 - 统一导入:明确导入
tensorflow和keras模块,避免引用错误。
内容的提问来源于stack exchange,提问作者huh
相关产品推荐
相关产品推荐

