解决TensorFlow训练模型中的NaN问题

一、前沿

最近搞cvr 转化时延建模的事情,升级了一下模型结构,并写了一个巨复杂的损失函数,但是调试好多时间,总是在训练过程中偶尔报下面的错误:

错误的原因是 计算auc的过程中偶尔出现 InvalidArgumentError (see above for traceback): assertion failed: [predictions must be in [0, 1]],也就是predictions中出现了[0,1] 区间之外的值。

注:predictions经过了sigmoid

登录后复制

labels_auc = model.auc(tasks_outputs, train_click_labels)_, auc = tf.metrics.auc(task_labels[..., i], 
predictions[..., i])self._traceback = tf_stack.extract_stack()
InvalidArgumentError (see above for traceback): assertion failed: 
[predictions must be in [0, 1]] [Condition x <= y did not hold element-wise:x (strided_slice_5:0) = ] 
[nan nan nan...] [y (auc/Cast_1/x:0) = ] [1]nvalidArgumentError (see above for traceback): 
assertion failed: [predictions must be in [0, 1]]1.2.3.4.5.6.7.


二、问题分析

使用TensorFlow、kersa 中实现不同的神经网络,出现Nan值的情况,一般来说有两种情况:

在loss中计算后得到了Nan值 在更新网络权 的时候出现了Nan值



三、在loss中得到Nan值

检查代码中是否存在 取对数运算,因为对数的真数部分不能为0。有0在取对数会报错,即使那个数经过了sigmoid处理也不行。tf.nn.sigmoid函数,在输出的参数非常大,或者非常小的情况下,会给出边界值1或者0。

tensorflow训练模型出现nan_tensorflow

所以我们要给对数运算的真数部分限定一个范围,否则会出现数值下溢的问题,可以使用tf.clip_by_value(input,min_value,max_value)函数来限定真数的下限。

登录后复制

tf.log(cvr) 改为下面 tf.log(tf.clip_by_value(cvr, 1e-10, 0.9999))1.2.3.



四、在更新网络权 的时候出现Nan值

在训练的过程中出现 预测值 为nan,可能数据有问题。要是训练过程中偶尔出现,你就需要 确保大致知道每一层的输出的一个范围,这样才能彻底的解决Nan值的出现,这个太难了。

在训练的过程中出现损失函数值为nan,这种情况一般是由于学习率太大,需要减小学习率;或者是在训练一段时间后出现nan,这种情况可能是由于梯度爆炸导致的,可以对梯度进行裁剪,将梯度的最大值限定在某个常数。




免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删

QR Code
微信扫一扫,欢迎咨询~

联系我们
武汉格发信息技术有限公司
湖北省武汉市经开区科技园西路6号103孵化器
电话:155-2731-8020 座机:027-59821821
邮件:tanzw@gofarlic.com
Copyright © 2023 Gofarsoft Co.,Ltd. 保留所有权利
遇到许可问题?该如何解决!?
评估许可证实际采购量? 
不清楚软件许可证使用数据? 
收到软件厂商律师函!?  
想要少购买点许可证,节省费用? 
收到软件厂商侵权通告!?  
有正版license,但许可证不够用,需要新购? 
联系方式 155-2731-8020
预留信息,一起解决您的问题
* 姓名:
* 手机:

* 公司名称:

姓名不为空

手机不正确

公司不为空