keras训练出现nan的解决流程

在使用DNN进行训练时遇到NaN问题,通过逐步排查训练集并调整代码,最终定位到特征处理中的除零风险,成功解决。分享了详细的调试步骤及经验总结。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这里出现nan可能是在train的loss阶段,也可能是train的metric阶段,还可能是validation阶段,反正都一样。
在写毕设的过程里面,用学弟提取的特征做DNN的训练,loss没有出现nan,但是反而是metric(MSE)里面出现了nan,predict的结果也全是nan。尝试了很多方法来调bug,最后采用的方法是将训练集二分的方法来调试。

  • 先将训练集划成(0,x),x是训练集的大小,假设x=1000
  • 首先尝试train_df = train_df[0:1000],出现了nan,然后缩减为[0,500],仍然出现问题,然后尝试[0,250],没有出现问题,然后尝试[250,500],以此类推
  • 最后缩减到训练集只有10个样本,保存在csv中,用pandas打开看数据,发现某个特征有inf值
  • 到学弟的代码里面查看该特征编写方法,发现除了一个值A,这个值A有极小概率为0,修改了他的计算方法。

最后总结下出现nan时候的调试方法:

1.第一步:检查训练集里面的特征是否出现Nan值或者Inf值。
2.第二步:如果是自己定义的函数(loss或者metric),检查有没有可能除0或者干脆都在分母加上一个极小值。
3.第三步:换一个优化器,如果没出现问题,可能是网络参数有问题,改小一下lr试试,或者调节下其他参数。

### Keras 模型中的 `TypeError: ufunc 'isnan' not supported` 问题分析与解决方案 #### 错误原因 此错误通常是由于数据类型不兼容引起的。具体来说,当尝试对非数值类型的列(如字符串或其他对象类型)应用 NumPy 函数 `np.isnan()` 时会发生此类错误。NumPy 的 `isnan()` 函数仅支持浮点数和整数类型的数据[^1]。如果数据集中包含其他类型的数据(例如字符串或类别变量),则会引发该错误。 #### 数据预处理的重要性 在构建深度学习模型之前,确保输入数据经过充分的预处理是非常重要的。对于图像分类任务,常见的预处理步骤包括统一图片大小、划分训练集和测试集、调整图片维度顺序以及对数据标签进行 One-Hot 编码等[^3]。这些步骤有助于提高模型性能并减少运行时错误的发生概率。 #### 解决方案 ##### 方法一:检查并转换数据类型 确保所有输入特征均为数值类型。可以通过以下代码片段来验证这一点: ```python import numpy as np data = [...] # 输入数据 if not np.issubdtype(data.dtype, np.number): data = data.astype(np.float32) # 转换为浮点数类型 ``` ##### 方法二:替换无效值 有时数据中可能存在缺失值或者非法值(如无穷大)。可以使用 Pandas 库中的函数对其进行清理: ```python import pandas as pd df = pd.DataFrame(data) cleaned_data = df.replace([np.inf, -np.inf], np.nan).dropna().values ``` ##### 方法三:归一化处理 为了使神经网络更好地收敛,建议对输入数据进行归一化处理。这一步骤尤其重要,尤其是在处理图像数据时。下面是一个简单的例子: ```python normalized_data = (data - np.min(data)) / (np.max(data) - np.min(data)) ``` #### 总结 通过以上方法可以有效避免 `TypeError: ufunc 'isnan' not supported` 错误的发生。关键是确保输入到模型中的数据满足其预期的要求,并且在整个流程中保持一致性和准确性[^2]。 --- ###
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值