Tensorflow 中的 loss 突然变成了 nan

Loss in Tensorflow suddenly turn into nan

当我使用tensorflow时,loss突然变成了nan,就像:

Epoch:  00001 || cost= 0.675003929
Epoch:  00002 || cost= 0.237375346
Epoch:  00003 || cost= 0.204962473
Epoch:  00004 || cost= 0.191322120
Epoch:  00005 || cost= 0.181427178
Epoch:  00006 || cost= 0.172107664
Epoch:  00007 || cost= 0.171604740
Epoch:  00008 || cost= 0.160334495
Epoch:  00009 || cost= 0.151639721
Epoch:  00010 || cost= 0.149983061
Epoch:  00011 || cost= 0.145890004
Epoch:  00012 || cost= 0.141182279
Epoch:  00013 || cost= 0.140914166
Epoch:  00014 || cost= 0.136189088
Epoch:  00015 || cost= 0.133215346
Epoch:  00016 || cost= 0.130046664
Epoch:  00017 || cost= 0.128267926
Epoch:  00018 || cost= 0.125328618
Epoch:  00019 || cost= 0.125053261
Epoch:  00020 || cost= nan
Epoch:  00021 || cost= nan
Epoch:  00022 || cost= nan
Epoch:  00023 || cost= nan
Epoch:  00024 || cost= nan
Epoch:  00025 || cost= nan
Epoch:  00026 || cost= nan
Epoch:  00027 || cost= nan

主要训练代码为:

for epoch in range(1000):
    Mcost = 0

    temp = []
    for i in range(total_batch):
        batch_X = X[i*batch_size:(i+1)*batch_size]
        batch_Y = Y[i*batch_size:(i+1)*batch_size]
        solver, c, pY = sess.run([train, cost, y_conv], feed_dict={x: batch_X, y_: batch_Y, keep_prob:0.8})
        Mcost = Mcost + c

    print("Epoch: ", '%05d'%(epoch+1), "|| cost=",'{:.9f}'.format(Mcost/total_batch))

由于前19个epoch的cost是OK的,我相信网络和输入是OK的。对于网络,我用了4个CNN,activate函数是relu,最后一层是full connect,没有activate函数。

此外,我知道 0/0 或 log(0) 将导致 nan。但是,我的损失函数是:

c1 = y_conv - y_
c2 = tf.square(c1)
c3 = tf.reduce_sum(c2,1)
c4 = tf.sqrt(c3)
cost = tf.reduce_mean(c4)

我 运行 使用 GPU GTX 1080 的张量流。

如有任何建议,我们将不胜感激。

通常,这些 NaN 是由于梯度增加而导致的优化分歧。它们通常不会立即出现,而是在损失突然增加并在几步内达到 inf 的阶段之后出现。你没有看到这种爆炸性增长的原因可能是因为你只在每个时期检查你的损失——尝试每一步或每隔几步显示你的损失,你很可能会看到这种现象。

至于为什么你的梯度突然爆炸,我建议你在你的损失函数中不使用 tf.sqrt 试试。这应该在数值上更稳定。 tf.sqrt 的缺点是 属性 梯度爆炸接近零。这意味着一旦您接近解决方案,就会增加分歧的风险——看起来很像您所观察到的。