WARNING:root:NaN or Inf found in input tensor.Test loss: nan,

博客作者在进行深度学习模型训练时遇到了准确率低和loss为nan的问题。首先,他们发现学习率过大或数据集问题可能导致梯度消失或爆炸,但调整学习率和检查数据集并未解决问题。后来发现是`net.train()`的使用位置错误,将其从循环外移到循环内解决了训练不正常的问题。此外,作者还提到优化器的选择影响训练结果,将原本的SGD优化器改为Adam后,训练恢复正常,最终成功完成训练。
摘要由CSDN通过智能技术生成

train的位置

今天把epoch改成step训练结果奇怪的发生了

在这里插入图片描述
然后准确率也超级低

在这里插入图片描述
查问题说是学习率过大或者数据有问题,导致梯度消失或者梯度爆炸,检查数据集或者不断调低学习率。

但是对于我来说是跑过的一样的数据集一样的读取和预处理,另外学习率已经够低了,说学习率调到0 错误消失说明就不是数据集的问题,我这样做了,但是精度一样如上的低,虽然Test loss 有数值了。

在这里插入图片描述
看代码也没问题,结果,果然是很细小的错误,

net.train()的用法位置!!!!!

先看epoch训练的net.train()位置

def train(total_step, net, optimizer, train_loader, criterion):
    
    net.train() # 这时候大部分代码都放这儿的
    
    for _,data in enumerate(train_loader):  # 以为把这里变成step放进总训练就好
        label = data.y
        if torch.cuda.is_available():
            data = data.to(device)
            label = label.to(device)

        # 前向传播计算损失
        out = net(data).squeeze()
        loss = criterion(out, label)

!!!重点就是net.train()的位置,(很多博客都说放在训练前的,以前epoch训练没问题,换step时粗心没有注意到,这样放的

    while total_step < args.need_step:
        # net.train() # 不应该放在这里了
 
        for step, data in enumerate(train_loader):  
        	net.train() # 放这里了
            label = data.y
            if torch.cuda.is_available():
                data = data.to(device)
                label = label.to(device)

            # 前向传播计算损失
            out = net(data).squeeze()  
            # 算损失
            loss = criterion(out, label)  
            ......

然后就正常了
在这里插入图片描述

优化器

2022.12.6晚更
调GIN调到脑壳大,各种参数层次都改了,而且本地没有数据,服务器上又不好调试,只有print来看,调了十多种可能,在明天即将组会的我还没跑出来。在这个差几分钟12点的夜晚,突然灵光一闪,好像以前有loss=nan的情况,除了写的这篇博客net.train的位置,还有就是优化器!!!没错,原始数据是Adam,后面导师让改成了SGD,SGD在GraphSage,GatedGCN都没问题,(那是在跑哪个GCN出现的这俩优化器换了会loss=nan),记不清了,反正灵光一闪是有这个印象,
在这里插入图片描述

果然,把SGD换成Adam

在这里插入图片描述
几个epoch后在这里插入图片描述

好了,可算是结束了。。

### 回答1: 这个警告是指在输入张量中发现了 NaNInfNaN 表示不是数字(Not a Number),Inf 表示无穷大(Infinity)。在机器学习和深度学习中,这通常表示模型训练过程中出现了问题,例如数值溢出或未处理的缺失值。为了确保模型的正确性,需要对输入数据进行检查并解决这个问题。 ### 回答2: 在机器学习或深度学习模型的训练过程中,我们通常会将大量的数据输入到模型中进行学习。然而,由于训练数据的质量的问题或者数据处理的问题等,我们有时会在数据中发现一些不合理的值,例如“NaN”或“Inf”。当出现这些问题时,我们通常会从模型的输出信息或者训练过程的日志中看到这样的警告信息:“Warning: root: NaN or Inf found in input tensor.”。这个警告信息告诉我们在输入张量中存在NaNInf。 首先,NaN代表不是一个数,通常出现在无穷大的运算中,例如0/0。Inf代表正无穷或负无穷,通常出现在除以0的运算中。当我们在处理数据时,如果一个输入张量包含NaNInf,模型的输出结果很可能是不可靠的。 发现这种问题时,我们应该尽快查找原因以及修复这个问题。通常找到这个问题的方法包括: 1. 检查数据源:首先我们应该检查我们的输入数据是否正确。如果数据源出现了问题,像数据文件损坏或数据采集出现漏洞,将大大影响整个模型的训练。 2. 检查数据预处理过程:我们的数据可能需要在输入到模型之前进行预处理,这可能就是数据出现问题的地方。例如,我们可能会对某些数据进行标准化处理,但是如果我们在标准化过程中出现了0作为除数的情况,就会出现Inf。 3. 检查模型的架构和参数:如果实际数据值本身不可能包含NaNInf,则问题可能出现在模型架构、参数或模型的实现中。 所以,当我们在训练模型时看到这个警告信息时,我们需要仔细检查我们的数据集,确保数据质量没有问题,并且要检查模型的架构和参数是否存在问题。正确的解决方法将有助于我们的模型在训练过程中更快地走向成功。 ### 回答3: 这个警告是在深度学习模型中出现的常见问题。它表示在输入张量中出现了NaN(非数)或Inf(无穷大)的值。它可能是由于训练数据中存在错误或缺失值等问题导致的。 在深度学习中,NaNInf值会影响计算结果,因为它们可能会在模型中传播,导致输出结果不稳定。这可能导致训练不收敛或模型在测试时产生错误的结果。 为了解决这个问题,我们可以检查输入数据中是否存在缺失值或无效值,并进行必要的数据清理和预处理。我们还可以使用数据填充或删除缺失值的方法,避免NaNInf值的出现。 此外,我们可以通过添加激活函数,正则化或减少学习率等技术来防止模型中出现NaNInf值。此外,我们可以添加断言或assert语句来检查模型是否输出了异常值。这样可以帮助我们及时发现问题并解决它们。 最后,我们应该认真处理这个警告并采取必要的措施来确保我们的深度学习模型可以正常运行,并产生准确可靠的结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lanmy_dl

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值