在训练中出现 NaN or Inf found in input tensor

在训练中出现 NaN or Inf found in input tensor

一、错误分析

在深度学习中,当你看到“NaN or Inf found in input tensor”这样的错误时,它意味着你的输入张量(tensor)中包含了非数字(NaN)或无穷大(Inf)的值。这些值通常是由于数值计算错误或不稳定导致的,并且它们会破坏模型的训练过程,导致预测精度不稳定或者模型完全无法学习。

  1. NaN和Inf值的出现可能由以下原因引起:
    • 数值溢出:当某个操作的结果太大,超出了数据类型能够表示的范围时,就会发生数值溢出。在浮点数中,这通常会导致Inf。
    • 除以零:任何数除以零在数学上都是未定义的,但在计算机中,这通常会导致Inf(正数除以零)或NaN(负数除以零或零除以零)。
    • 不稳定的计算:某些数学操作(如对数运算的底数为非正数)会导致NaN。
    • 梯度爆炸或消失:在训练深度神经网络时,梯度可能会变得非常大或非常小,这可能导致权重更新不稳定,并可能引入NaN或Inf值。
    • 初始化问题:网络权重的初始值可能会导致数值不稳定。
  2. 可以通过以下方法解决NaN或Inf值的问题:
    • 检查数据:确保输入数据中没有NaN或Inf值。可以使用torch.isnan()torch.isinf()函数来检查张量中的NaN和Inf值。
    • 检查操作:检查代码中可能导致数值不稳定的操作,如除法、对数运算等。确保它们的输入在合理的范围内。
    • 梯度裁剪:如果问题是由梯度爆炸引起的,可以使用梯度裁剪(gradient clipping)来限制梯度的最大值。
    • 更改数据类型:使用更高精度的数据类型(如float64而不是float32)可能有助于减少数值不稳定性。
    • 权重初始化:使用合适的权重初始化方法,如He初始化或Xavier初始化,以避免初始权重导致的问题。
    • 调试:在训练过程中逐步检查张量的值,以便找到何时何地出现了NaN或Inf。这可以通过在训练循环的不同点插入打印语句或使用调试器来完成。

注意!一旦NaN或Inf值出现在张量中,它们通常会迅速传播到整个张量,因此重要的是尽快找到并修复它们的来源。

二、检查数据否存在NAN值或Inf值

  1. 检查数据文件是否存在NAN值
import numpy as np
import os
import glob


def check_files_for_nan(file_list):
    for filename in file_list:
        if not os.path.exists(filename):
            print(f"文件 {filename} 不存在。")
            continue

        try:
            # 假设数据是逗号分隔的,可以根据实际情况调整delimiter参数
            data = np.loadtxt(filename, delimiter=' ', skiprows=1)  # 如果txt文件有标题行,可以使用skiprows参数跳过
        except Exception as e:
            print(f"读取文件 {filename} 时发生错误: {e}")
            continue

            # 检查是否存在NaN值
        if np.isnan(data).any():
            print(f"文件 {filename} 中存在NaN值。")
        else:
            print(f"文件 {filename} 中不存在NaN值。")

        # 创建一个包含文件名的列表

if __name__ == "__main__":

    dataset_path = ''  # 请替换为你的文件名列表
    data_list = glob.glob(os.path.join(dataset_path, "*.txt"))

    # 检查文件列表中的每个文件
    check_files_for_nan(data_list)
  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值