关于TensorFlow-gpu出现nan原因

之前由于都在训练小规模样本,电脑一直用的都是TensorFlow cpu版,今天心血来潮,将电脑的TensorFlow改成了gpu版,想信心满满的跑一下之前的程序,结果出现了问题:本该迅速下降的训练loss一直卡在 nan 上。我的电脑除了TensorFlow换成了gpu版的,其他设置一概没有动,程序也是在之前cpu版TensorFlow上运行完美,所以我开始的时候一脸黑人问号!!!
后来经过排查,发现了问题:程序读取数据后,经过第一次训练返回了一个全是nan的数组,这说明问题出在模型训练上,而模型的结构是封装好的keras,不会出现问题,所以,唯一可能出现问题的地方就是损失的计算了。在锁定了目标后,又经过了半个多小时的仔细排查(挨个损失函数注释后,再运行程序,看bug是否解决),发现将

 tf.reduce_mean( ( M * X - M * G_sample )**2 ) 

这条语句注释后,程序居然不会返回 nan数组 了,神奇!
后来又对这条语句进行拆分,终于发现了本质的问题:
由于TensorFlow-gpu版不支持双星号(**)运算,所以在损失计算时,返回的数组就会变成nan。

后续
发现了问题后,尝试了一些其他的平方运算方式,目前得知用内置函数pow(a,b)的方式,也会导致nan数组的出现,而使用math包中的math.pow(a,b)则会导致报错,所以最后妥协了:

tf.reduce_mean( (M * X - M * G_sample) * (M * X - M * G_sample) ) 

不好看,但是程序可以正常运行了

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 11
    评论
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值