2017-06-12 3 views
2

に変身:損失は、突然、私はtensorflowを使用した場合、損失が突然同じように、ナンに変身ナン

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エポックでOK、私はネットワークと入力がOKだと思います。ネットワークでは、4つのCNNを使用し、アクティブ化機能はreluであり、最後のレイヤーは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

でtensorflowを実行します。

答えて

2

多くの場合、それらのNaNは、勾配の増加による最適化の相違に由来します。彼らは通常、一度に表示されませんが、むしろ損失が突然増加し、いくつかのステップの中でinfに達する段階の後に表示されます。この爆発的な増加が見られない理由は、おそらくあなたが失われたすべての時代をチェックしているからです。あなたの損失をすべてのステップまたはいくつかのステップで表示しようとします。

なぜあなたのグラデーションが突然爆発するのかについては、あなたの損失機能でtf.sqrtを試してみることをお勧めします。これは数値的に安定しているはずです。 tf.sqrtは、爆発勾配をゼロに近づけるという悪い特性を有する。これは、ソリューションに近づくと発散のリスクが増加することを意味します。これは、観察しているものによく似ています。

+0

ありがとうございます。そして、tf.sqrtが問題かもしれません。しかし、tf.sqrtを除外すると、損失の減少は非常に遅くなります。私はその理由を知らない。次に、c2 = tf.square(c1)をc2 = tf.square(c1)+ 1に変更します。損失の減少はOKです。 –

関連する問題