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

所以我们要给对数运算的真数部分限定一个范围,否则会出现数值下溢的问题,可以使用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,这种情况可能是由于梯度爆炸导致的,可以对梯度进行裁剪,将梯度的最大值限定在某个常数。
免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删
武汉格发信息技术有限公司,格发许可优化管理系统可以帮你评估贵公司软件许可的真实需求,再低成本合规性管理软件许可,帮助贵司提高软件投资回报率,为软件采购、使用提供科学决策依据。支持的软件有: CAD,CAE,PDM,PLM,Catia,Ugnx, AutoCAD, Pro/E, Solidworks ,Hyperworks, Protel,CAXA,OpenWorks LandMark,MATLAB,Enovia,Winchill,TeamCenter,MathCAD,Ansys, Abaqus,ls-dyna, Fluent, MSC,Bentley,License,UG,ug,catia,Dassault Systèmes,AutoDesk,Altair,autocad,PTC,SolidWorks,Ansys,Siemens PLM Software,Paradigm,Mathworks,Borland,AVEVA,ESRI,hP,Solibri,Progman,Leica,Cadence,IBM,SIMULIA,Citrix,Sybase,Schlumberger,MSC Products...