torch数组计算出现NAN

在torch中零除零不会报错,结果会是NaN。

比如

a = torch.tensor([0,0])

a/a

output: tensor([nan])

PS: 这个白痴问题我想了好久,最后还是靠print才解决。没想到这里是因为平常如果除零的话是会报错的,但是在numpy里会提醒,torch里不提醒。解决办法就是a.clamp(1e-4)

### 导致验证集结果为NaN的原因 在深度学习过程中,当遇到验证集的结果变为NaN的情况时,这通常由多种因素引起: - **过高的学习率**:如果在网络训练初期(例如前100次迭代内),损失函数值迅速变为NaN,则可能是由于设定的学习率过高所致[^1]。适当减少学习率有助于稳定训练过程。 - **梯度爆炸问题**:对于像RNN这样的循环结构,在反向传播期间可能会遭遇梯度爆炸的现象,进而引发NaN值的产生。针对此类情形,“gradient clipping”技术能有效地控制梯度大小,防止其无限增长而造成数值不稳定。 - **数据预处理不当**:包括但不限于除零操作、取自然对数时传入非正值参数等问题均可能导致计算结果异常;另外还需注意确保用于计算loss的数据范围合理合法,避免数组索引超出界限等情况发生。 - **特殊运算中的溢出风险**:特别是在实现自定义层或激活函数时,如果没有妥善处理大数值带来的潜在影响——如未经优化直接执行`exp()`函数求幂运算,很容易因为浮点数精度限制而导致最终输出呈现为无穷大(INF)/无穷小(0),从而形成NaN形式的表现。 - **标签缺失或不匹配**:当样本对应的ground truth标注存在缺陷或者完全丢失时,同样会干扰到整个系统的正常运作流程,使得评估指标无法获得有意义的反馈信息,表现为持续性的NaN状态。 ### 解决方案概述 为了应对上述提到的各种可能性所造成的验证集中出现NaN的问题,建议采取如下措施: #### 调整超参数设置 通过逐步下调初始配置里的learning rate直到不再触发该类故障为止,并密切监控每次调整后的表现变化趋势,以此找到最合适的平衡点。 #### 应用Gradient Clipping策略 引入额外机制来限定每一轮更新权重前后允许的最大绝对幅度差额,即所谓的“裁剪”,这样即使面对极端情况下也能保持住整体架构内部各节点间的相对稳定性。 #### 完善输入校验逻辑 强化前端过滤环节的设计思路,提前排除掉那些明显不符合预期模式特征的对象实例进入后续阶段之前就被拦截下来并给出警告提示,同时还要仔细审查所有参与数学变换的操作符及其作用对象是否满足基本前提条件的要求。 #### 改进特定组件设计细节 特别是涉及到复杂表达式的构建部分更要谨慎行事,务必参照业界通行做法加入必要的防护手段以规避不必要的麻烦,比如Softmax分类器里边应该考虑先做一次平移转换再继续下一步骤以免直接面临指数级膨胀的风险。 #### 数据质量把控 严格审核训练与测试两套资料库之间的对应关系以及各自内部条目构成的一致性和完整性,杜绝任何形式上的错位现象的发生,保证每一个批次提交给算法引擎处理的信息都是完整可靠的。 ```python import torch.nn as nn from torch.optim import Adam class CustomModel(nn.Module): def __init__(self, input_size, hidden_size, output_size): super(CustomModel, self).__init__() self.fc = nn.Linear(input_size, hidden_size) self.relu = nn.ReLU() self.out_layer = nn.Linear(hidden_size, output_size) def forward(self, x): out = self.fc(x) out = self.relu(out) logits = self.out_layer(out) # Apply gradient clipping to prevent exploding gradients max_norm = 5.0 for parameter in model.parameters(): if parameter.grad is not None: parameter.grad.data.clamp_(-max_norm, max_norm) return logits model = CustomModel(...) optimizer = Adam(model.parameters(), lr=initial_learning_rate / factor_to_reduce_lr_by_if_nan_occurs) ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值