You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

训练Conv1D神经网络时Loss为NaN、准确率为0的问题排查与解决

解决Conv1D训练中loss与准确率全为NaN的问题

我来帮你排查这个棘手的问题——这种全NaN的训练结果,大概率不是网络结构本身的问题,而是数据预处理、标签或者训练参数出了纰漏,咱们一步步拆解:

最可能的原因及修复方案

1. 输入数据/标签中存在NaN/无穷大值

这是导致loss直接变成NaN的最常见原因。你可以先做个快速检测:

import numpy as np
# 检查输入数据的异常值
print(np.isnan(X).any(), np.isinf(X).any())
# 检查标签的异常值
print(np.isnan(y).any(), np.isinf(y).any())

如果检测结果是True,可以这样处理:

  • 缺失值:用该特征的均值/中位数填充,或者直接删除对应样本;
  • 无穷大值:替换成该特征的最大/最小值,或者用np.nan_to_num()一键处理:
    X = np.nan_to_num(X, nan=np.mean(X), posinf=np.max(X), neginf=np.min(X))
    y = np.nan_to_num(y)
    

2. 数据未做归一化/标准化

Conv1D对输入数据的数值范围很敏感,如果不同特征的数值跨度极大(比如有的特征是几千,有的是0.01),很容易引发梯度爆炸,最终导致权重和loss变成NaN。
建议对数据做标准化处理,注意要只在训练集上拟合标准化器,避免数据泄露:

from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
# 把(1000,700,7)的形状转成(1000*700,7)来拟合,再转回去保持原结构
X_scaled = scaler.fit_transform(X.reshape(-1, 7)).reshape(X.shape)

3. 标签存在异常

你用的是二元交叉熵损失,标签必须是0或1的数值类型,不能是字符串、其他数值,也不能全为0或全为1(全单一类别虽然不会导致NaN,但准确率会一直为0)。
检查标签数组:

print(np.unique(y))  # 正常结果应该只有0和1
print(len(y[y==0]), len(y[y==1]))  # 确认类别分布不是极端失衡

4. 学习率过高

Adam默认的0.001学习率,在未归一化的数据上可能太大,导致梯度爆炸。可以试试调低学习率:

from tensorflow.keras.optimizers import Adam
model.compile(optimizer=Adam(learning_rate=0.0001), 
              loss='binary_crossentropy', 
              metrics=['accuracy'])

如果还是不行,可以继续降到0.00001试试。

5. 代码语法错误

你的模型定义里有个小疏漏:model.add(Conv1D(32, 3, padding='same', input_shape=(700,7))这行少了个右括号,虽然可能是你复制时的笔误,但如果代码真的这么写,会直接报错,先把这个语法问题修正。

修正后的完整示例代码

import numpy as np
from sklearn.preprocessing import StandardScaler
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Conv1D, Activation, MaxPooling1D, Dropout, Flatten, Dense
from tensorflow.keras.optimizers import Adam

# 假设你的输入数据是X,标签是y
# 1. 处理数据中的异常值
X = np.nan_to_num(X, nan=np.mean(X), posinf=np.max(X), neginf=np.min(X))
y = np.nan_to_num(y)

# 2. 对输入数据做标准化
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X.reshape(-1, 7)).reshape(X.shape)

# 3. 定义并编译模型
model = Sequential()
model.add(Conv1D(32, 3, padding='same', input_shape=(700,7)))  # 补全右括号
model.add(Activation('relu'))
model.add(Conv1D(32,3))
model.add(Activation('relu'))
model.add(MaxPooling1D())
model.add(Dropout(0.25))
model.add(Flatten())
model.add(Dense(128))
model.add(Activation('relu'))
model.add(Dropout(0.5))
model.add(Dense(1))
model.add(Activation('sigmoid'))

model.compile(optimizer=Adam(learning_rate=0.0001), 
              loss='binary_crossentropy', 
              metrics=['accuracy'])

# 开始训练
history = model.fit(X_scaled, y, epochs=100, validation_split=0.2)

内容的提问来源于stack exchange,提问作者espgen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:20:31