之前由于都在训练小规模样本,电脑一直用的都是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) )
不好看,但是程序可以正常运行了