2017-05-22 31 views
1

我有一個基於alexnet的年齡分類網絡。 當我訓練網絡8班時,它的工作完全正常,但是當我增加班級到60或100我得到「'模型分散與損失= NaN」 我已經降低了學習率0.00000001甚至0.0和浴缸大小減少到1 。但沒有幫助。'模型與損失分離= NaN',當班級數量增加時,即使學習率很低。 [tensorflow]

我的損失函數爲:

def loss(logits, labels): 
    labels = tf.cast(labels, tf.int32) #trying to avoig log(0) 
    shape = [logits.get_shape()[0], 57] 
    epsilon = tf.constant(value=0.1, shape=shape) 
    logits = logits + epsilon  



    cross_entropy = tf.nn.sparse_softmax_cross_entropy_with_logits(
     logits= logits,labels= labels, name='cross_entropy_per_example') 
    cross_entropy_mean = tf.reduce_mean(cross_entropy, name='cross_entropy',) 
    tf.add_to_collection('losses', cross_entropy_mean) 
    losses = tf.get_collection('losses') 
    regularization_losses = tf.get_collection(tf.GraphKeys.REGULARIZATION_LOSSES) 
    total_loss = cross_entropy_mean + LAMBDA * sum(regularization_losses) 
    tf.summary.scalar('tl (raw)', total_loss) 
    #total_loss = tf.add_n(losses + regularization_losses, name='total_loss') 
    loss_averages = tf.train.ExponentialMovingAverage(0.9, name='avg') 
    loss_averages_op = loss_averages.apply(losses + [total_loss]) 
    for l in losses + [total_loss]: 
     tf.summary.scalar(l.op.name + ' (raw)', l) 
     tf.summary.scalar(l.op.name, loss_averages.average(l)) 
    with tf.control_dependencies([loss_averages_op]): 
     total_loss = tf.identity(total_loss) 
    return total_loss 

任何想法如何解決這個問題?

回答

1

另一個可能的嘗試是改變你的權重的初始化,有時減少幅度可以幫助。您還可以查看使用add_check_numeric_ops調試確切位置NaN是從哪裏來的,如本例所示: Debugging nans in the backward pass

+0

澤維爾@皮特·沃登我使用澤維爾初始化你認爲它應該改變? – Sesoin

1

看起來你是在處理一個不平衡的數據集,您要添加一個很小的值時,你有沒有課在批次中,對嗎? 我沒有在您發佈的代碼中看到任何權重,據我所知爲類添加一個小常數對於類使用權重是有意義的。無論如何,假設其餘的都是正確的,也許0.1的值相對來說太大了,並且可能會導致不穩定。嘗試一個非常小的,如1e-8。您也可以只添加添加元素明智的整個logits張這樣一個常數:

epsilon = tf.constant(1e-8) 
logits = logits + epsilon