训练神经网络时train loss或是validation loss出现nan

通过loss曲线诊断神经网络模型 本文首先会介绍loss曲线表现形式,过拟合,欠拟合等等。然后展示如何使用matplotlib绘制loss曲线。 一、Loss曲线 通常数据集会被划分成三部分,训练集(training dataset)、验证集(validation dataset)、测试集(test dataset)。我们在训练模型时也经常会根据训练集的loss和验证集loss来诊断模型,从而期望能够优化参数训练处一个更好的模... 阅读详情

最近使用带有SE block的网络在pytorch框架下做训练。training loss 随着epoch增多不断下降,但是突然到某一个epoch出现loss为nan的情况,但是两三个epoch之后,loss竟然又恢复正常,而且下降了。
这几篇博客是我debug的借鉴,真的非常有用。
这篇介绍了出现nan的基本解决思路。
https://blog.youkuaiyun.com/qq_32799915/article/details/80612342
这篇介绍了为什么在多层dense layer之后某一层dense layer输出可能会出现nan,以及weight初始化的重要性及初始化方法。
https://yey.world/2020/12/17/Pytorch-14/
我自己的基本排查思路是:

  1. 首先检查数据中是否有inf 或者nan的情况。

普通numpy数组可用

np.all(np.isfinite(data))

我自己用的是医疗图像nifiti格式的压缩图像,所以使用代码如下:

def check_image(img_fname: str):
	#检查图像/numpy数组中是否有nan存在
    npy = sitk.GetArrayFromImage(sitk.ReadImage(img_fname))
    return np.any(np.isnan(npy))

def check_image_inf(img_fname: str):
	#检查图像/numpy数组中数据是否都是finit的(提示:若使用此函数,单独检查nan的函数可不用)
    npy = sitk.GetArrayFromImage(sitk.ReadImage(img_fname))
    return np.all(np.isfinite(npy))

def check_for_nan(input_folder: str):
    nii_files = subfiles(input_folder, suffix='.nii.gz')
    for n in nii_files:
        if check_image(n):
            print("nans found in ", n)
        elif not check_image_inf(n):
            print("infs found in ", n)
            
img_fold = '' #保存数据的文件夹
check_for_nan(img_fold)

如果数据没有问题,检查数据是否有normalization,如果没有归一化也可能出现nan或者网络层计算中出现infinit。

  1. 检查使用loss是否带有除法,算log的时候有负数或者很小的数。
    我所用的检查loss是否为nan的方法:
assert torch.isnan(loss).sum() == 0 and torch.isinf(loss).sum() == 0, ('loss is nan or ifinit', loss)

如果loss中有infit或者nan,则会输出

'loss is nan or ifinit', loss(这里会输出loss的值)

如果确认loss也并没有问题,那么问题可能出现在forward path中。

  1. 检查forward path每一层的输出结果,进行问题定位。在每一层后加入:
assert torch.isnan(out).sum() == 0 and torch.isinf(out).sum() == 0, ('output of XX layer is nan or infinit', out.std()) #out 是你本层的输出 out.std()输出标准差

如果是某一层计算出问题,考虑是不是初始化函数没有使用或者用得不对。
接下来,就到我的检查血泪史了。我发现我SE block的nn.AdaptiveAvgPool3d(1)输出中有inf!!!奇怪的是,这一次层的输入却没这个问题。后来我直接用了torch.nn.AvgPool3d代替前面的函数,它终于正常跑起来了。

b, c, D, H, W = x.size()  #b: batch size, c: channels, (D, H, W) data shape
y = torch.nn.AvgPool3d((D,H,W), padding=0)(x)
y = y.view(b, c) # 将y变成shape为(b,c)的tensor, 后面接全连接层

一周的辛酸血泪,终于好了。
具体nn.AdaptiveAvgPool3d()函数的内部实现我还没来得及研究,之后搞明白了再来分享到底为啥出问题。

解决模型训练过程中loss出现Nan值的情况 训练过程中的 MulBackward0 出现了问题,这表明在计算 梯度时,出现了数值不稳定,具体是在执行 torch.exp(logits) 时。这种问题通常出现在计算中涉及指数运算(exp)时,如果输入的数值非常大,就可能导致溢出或产生 NaN。可以定位到Ls = criterion_simclr(features_prob),即features_prob的值很大,也就是我让模型返回的feature很大,所以我在模型输出之前加入了特征正则化,问题解决。放在训练最开始的部分,例如训练循环的外部即可。 阅读详情

相关推荐

PyTorch神经网络实战:从数据准备到模型训练与验证的完整流程

机器学习项目的成功往往始于高质量的数据准备与严谨的模型验证流程。数据预处理、特征工程和数据集划分是构建可靠机器学习系统的基石,它们直接影响模型的泛化能力。通过标准化、归一化等技术处理数值特征,并采用独热编码等方法处理类别特征,可以为模型提供有效的输入。在模型训练过程中,理解过拟合与欠拟合的动态平衡至关重要,这需要通过验证集持续监控模型表现。PyTorch框架以其动态计算图和Pythonic设计,为开发者提供了透明且灵活的工具链,便于实现从Dataset、DataLoader到自定义训练循环的完整流程。本文聚

weixin_34258838的博客 391

caffe下一些参数的设置

weight_decay防止过拟合的参数,使用方式: 1 样本越多,该值越小 2 模型参数越多,该值越大 一般建议值: weight_decay: 0.0005 lr_mult,decay_mult 关于偏置与参数使用不同的学习率与权重衰减项: 1 偏置的学习率一般为参数的两倍 比如一个卷积,有偏置的话,其学习率应该是   param { lr_mult: 1 }   param { lr_mu...

Yes,I do...huima2017的博客 854

PyTorch全连接神经网络实战:从构建、优化到超参数调优

人工神经网络(ANN)是深度学习的基石概念,其核心在于前向传播的张量计算与反向传播的梯度更新机制。理解权重初始化、激活函数选择、学习率与批量大小的耦合关系等原理,直接决定模型收敛性与泛化能力。PyTorch作为主流动态图框架,通过nn.Module、autograd和torch.optim三大模块,为ANN提供了高度可控的实现路径——这不仅是API调用,更是对计算图生命周期、内存管理及数值稳定性的工程实践。典型应用场景包括结构化数据分类(如Wine Quality)、特征提取基线构建及算法岗面试深度考察。本

a5199519的博客 464

模型的欠拟合和过拟合

模型过拟合,如你使用三次函数拟合二次函数就是过拟合。模型欠拟合,如你用一次函数拟合二次函数就是欠拟合。两种情况均会导致模型泛化能力较差。

qq_43369406的博客 1302

Keras神经网络回归实战:从MSE损失到梯度更新的完整解析

神经网络回归任务本质是学习输入到连续输出的可微映射函数,其核心区别于分类在于输出空间无界性与损失函数的统计假设。MSE损失隐含高斯噪声假设和均值优化目标,直接决定梯度计算路径与权重更新方向;而Keras封装下的model.compile与fit流程,实则封装了张量形状契约、自动微分、Adam自适应梯度裁剪等关键机制。理解这些原理,才能诊断验证MAE停滞、nan loss、预测坍缩等典型问题,并在房价预测、时序回归等真实场景中合理选择激活函数、初始化策略与正则化方式。本文以正弦拟合为最小闭环,还原全连接网络在

522

深度学习调试实战:从loss突增到指标翻盘的系统化排障方法

神经网络调试不是查找代码bug,而是重建数据、模型与优化器之间的信任链。其核心在于理解损失函数下降不等于任务学习成功,需同步监控loss、梯度流与输出分布三大信号。实践中,90%的失败源于数据预处理偏差、随机性失控或归一化层状态错位等‘非报错型故障’。本文聚焦可复现的工程化调试范式,涵盖输入分布快照、梯度健康度评估、Batch-Level一致性校验等关键技术手段,并深度融合PyTorch确定性配置与外科手术式干预策略,为算法工程师提供即插即用的排障流水线。

all00747的博客 367

train loss与test loss结果分析

train loss与test loss结果分析 train loss 不断下降,test loss不断下降,说明网络仍在学习; train loss 不断下降,test loss趋于不变,说明网络过拟合; train loss 趋于不变,test loss不断下降,说明数据集100%有问题; train loss 趋于不变,test loss趋于不变,说明学习遇到瓶颈,需要减小学习率或批量数目...

douzi949389的博客 685

Keras EarlyStopping深度解析:从过拟合控制到生产级训练决策

EarlyStopping是深度学习训练中用于防止过拟合的核心机制,其本质是基于验证指标动态变化的阈值判断系统。它通过监控损失或精度等指标的连续停滞行为,结合patience、min_delta、mode等参数构成状态机式早停策略,在数学上体现为滑动窗口内的单调性检验。该技术显著提升模型泛化能力与训练资源利用率,广泛应用于图像分类、金融风控、推荐系统等需平衡精度与效率的关键场景。本文聚焦Keras框架下EarlyStopping的工程化落地,深入剖析monitor指标选择失当、mode逻辑反向、restor

weixin_30876945的博客 529

用TensorBoard实时监控MelGAN训练:损失曲线与音频波形可视化全教程

训练一个高质量的语音合成模型(Vocoder),最头疼的往往不是写代码,而是**看不见训练过程**。MelGAN 作为轻量高效的神经网络声码器,配合 NVIDIA/tacotron2 可直接把梅尔频谱转为原始音频,但它的 GAN 对抗训练是否收敛、生成器与判别器是否失衡,光看终端日志根本无从判断。本文将手把手教你用 **TensorBoard 实时监控 MelGAN 训练**,把损失曲线与音频波形

gitblog_00075的博客 722

神经网络超参数快速启动框架:30分钟获得可迭代初始配置

神经网络超参数并非调参玄学,而是受计算资源、数据特性和模型结构共同约束的工程问题。理解learning rate warmup机制与batch size scaling law,能避免梯度震荡和收敛失败;掌握weight decay经验比与optimizer选择矩阵,可显著提升小样本、Transformer等场景的泛化能力。该框架将高维搜索降维为物理可解释的主轴校准,适用于CV/NLP小模型落地,尤其在显存受限、数据量少或架构混合等工业级约束下,实现从零到稳定训练的30分钟快速启动。

vanadiumlin 637

TensorFlow深度学习入门实战:从张量自动求导到CNN模型训练

深度学习框架是人工智能领域的基础工具,而TensorFlow凭借其完整的工程化能力,成为从学术研究到生产部署的主流选择。理解深度学习,首先要掌握张量这一核心数据结构,它定义了数据的多维表示与流动方式;其次要理解自动求导机制,它让神经网络的反向传播无需手动推导梯度,大幅降低建模门槛。在实际应用中,模型构建、训练与评估是标准流程,卷积神经网络则在图像识别任务中展现出强大能力。对于初学者,从环境搭建、数据预处理到训练第一个图片分类模型,是建立完整认知的最佳路径。本文从基础概念出发,系统讲解TensorFlow的核

weixin_30764883的博客 386

BP神经网络算法 Python 3.11 实现:从零推导反向传播,Loss 降至 0.01 以下

本文详细介绍了如何使用Python 3.11从零实现BP神经网络算法,包括反向传播的数学推导和代码实现。通过前向传播、损失计算和反向传播的完整流程,最终将模型损失值降至0.01以下。文章还提供了可视化训练过程和实战案例,帮助读者深入理解人工智能中的神经网络工作原理。

weixin_30314793的博客 401

深度学习27个核心概念实战解析:从调试故障到训练闭环

深度学习不是术语背诵,而是可调试、可验证、可落地的工程实践。理解batch size如何平衡显存与梯度质量、activation function如何解决梯度消失、batch normalization如何缓解内部协变量偏移,是构建稳定训练流程的基础。这些概念共同支撑模型收敛性、泛化能力与部署鲁棒性,在图像分类、语义分割、时序建模等任务中直接影响F1、mIoU、ECE等关键指标。本文聚焦真实项目中的27个高频术语,覆盖数据加载、模型结构、优化策略与故障排查全链路,提供可复现的代码验证方式、内存估算公式与错误

361

手把手搭建第一个全连接神经网络:从MNIST到生产级调试

神经网络是深度学习的基础计算模型,其核心在于通过多层非线性变换实现特征抽象与映射。理解其工作原理需掌握数据流、计算图、优化器行为与评估闭环四大要素。全连接网络因结构透明、可完全可视化、计算开销可控,成为建立工程直觉的理想起点;而MNIST作为标准化诊断工具,能精准暴露预处理、标签编码、激活函数选择等关键环节的细微错误。结合TensorFlow/Keras的高可读性API与详尽报错机制,初学者可快速建立参数意义(如batch_size=128对内存与梯度稳定性的权衡)、激活函数适配(ReLU用于隐藏层,Sof

526

模型微调核心指标:训练损失(Training Loss)与验证损失(Validation Loss)全解析

损失(Loss)本质是模型预测结果与真实答案的“差距”——损失值越低,说明模型预测越接近真实情况。指标训练损失(Training Loss)验证损失(Validation Loss)数据来源用于模型训练的数据集(“课本例题”)未参与训练的独立数据集(“模拟考试卷”)核心作用衡量模型在“训练数据上的拟合程度”(是否学会例题)衡量模型的“泛化能力”(是否能举一反三,应对新场景)计算时机每训练一个批次(Batch)或一个epoch后计算每训练一个epoch后计算(避免频繁评估影响效率)通俗类比。

lpfasd123的博客 992

深度学习入门|神经网络+前向传播+反向传播通俗讲解+AI训练师考点

深度学习核心概念摘要 本文系统介绍了深度学习的基础知识,重点解析神经网络的工作原理。主要内容包括: 神经元模型:对比生物神经元与人工感知机,阐述输入、权重、偏置和激活函数的作用机制。 网络结构:讲解多层神经网络的分层设计(输入层、隐藏层、输出层)及其特征提取过程,解释"深度"学习的本质是层次化特征抽象。 激活函数:分析Sigmoid、ReLU等主流激活函数的特性及适用场景,强调非线性激活对模型表达能力的关键作用。 前向传播:通过具体计算示例演示数据从输入到输出的完整传递过程,包括线性变换

白话机器学习 1077

MNIST模型对比实录:全连接与CNN的训练调参与准确率分析

图像分类是深度学习中最基础的任务之一,而MNIST手写数字识别被广泛用作评估模型结构的标准数据集。通过对比全连接神经网络与卷积神经网络的训练过程,可以直观理解局部连接、权值共享和深度特征组合对模型泛化能力的影响。在工程实践中,模型评估不能只看准确率,还需关注参数量、训练时间和过拟合程度。从单层Softmax到多层MLP再到CNN,准确率逐步提升至99%以上,但结构差异带来的错误倾向也各不相同。掌握这些对比方法与调参技巧,有助于在真实图像分类项目中快速选择合适的网络结构。

weixin_33851429的博客 572

基于RNN的推荐模型实战:从序列切分到GRU训练与评估

循环神经网络善于捕获序列数据中的时序依赖,其变体GRU在推荐系统中尤为常见。基于RNN的推荐模型将用户行为视为时间序列,通过建模“前N个行为→下一个行为”的映射,解决传统协同过滤忽视行为顺序的难题。该类模型无需维护长期用户画像,仅依赖近期交互即可预测下一步操作,广泛适用于会话推荐、购物车预测和短视频推荐等场景。本文基于PyTorch和Jupyter Notebook环境,完整演示了行为序列切分、滑动窗口采样、Padding处理、GRU模型训练与hit@10评估的工程流程,并梳理了数据编码、梯度裁剪、负采样和

weixin_34090562的博客 425
上一篇: 读取和保存nifti图像之nibabel与SimpleITK的区别
下一篇: 关于核磁共振图像的命名原则及含义(总结自用)
qq_41663215
博客等级 码龄9年 5粉丝 6原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值