簡體   English   中英

keras模型中的nan損失值

[英]nan values in loss in keras model

我有以下數據形狀

X_Train.shape,Y_Train.shape
Out[52]: ((983, 19900), (983,))
X_Test.shape,Y_Test.shape
Out[53]: ((52, 19900), (52,))

我正在運行一個簡單的二進制分類器,因為Y_train和Y_test可以是1或2

import  keras
import  tensorflow as tf
from keras import  layers
from keras.layers import Input, Dense
from keras.models import Model,Sequential
import numpy as np
from  keras.optimizers import  Adam

myModel = keras.Sequential([
    keras.layers.Dense(1000,activation=tf.nn.relu,input_shape=(19900,)),
    keras.layers.Dense(64, activation=tf.nn.relu),
    keras.layers.Dense(32, activation=tf.nn.relu),
    keras.layers.Dense(1, activation=tf.nn.softmax)
])

myModel.compile(optimizer='adam', loss='sparse_categorical_crossentropy',metrics=['accuracy'])
myModel.fit(X_Train, Y_Train, epochs=100,batch_size=1000)
test_loss,test_acc=myModel.evaluate(X_Test,Y_Test)

代碼輸出

訓練損失和准確性

Epoch 1/100
983/983 [==============================] - 1s 1ms/step - loss: nan - acc: 0.4608
Epoch 2/100
983/983 [==============================] - 0s 206us/step - loss: nan - acc: 0.4873
Epoch 3/100
983/983 [==============================] - 0s 200us/step - loss: nan - acc: 0.4883
Epoch 4/100
983/983 [==============================] - 0s 197us/step - loss: nan - acc: 0.4883
Epoch 5/100
983/983 [==============================] - 0s 194us/step - loss: nan - acc: 0.4873
Epoch 6/100
983/983 [==============================] - 0s 202us/step - loss: nan - acc: 0.4863
Epoch 7/100
983/983 [==============================] - 0s 198us/step - loss: nan - acc: 0.4863
Epoch 8/100
983/983 [==============================] - 0s 194us/step - loss: nan - acc: 0.4883
Epoch 9/100
983/983 [==============================] - 0s 196us/step - loss: nan - acc: 0.4873
Epoch 10/100
983/983 [==============================] - 0s 198us/step - loss: nan - acc: 0.4873
Epoch 11/100
983/983 [==============================] - 0s 200us/step - loss: nan - acc: 0.4893
Epoch 12/100
983/983 [==============================] - 0s 198us/step - loss: nan - acc: 0.4873
Epoch 13/100
983/983 [==============================] - 0s 194us/step - loss: nan - acc: 0.4873
Epoch 14/100
983/983 [==============================] - 0s 197us/step - loss: nan - acc: 0.4883
Epoch 97/100
    983/983 [==============================] - 0s 196us/step - loss: nan - acc: 0.4893
Epoch 98/100
    983/983 [==============================] - 0s 199us/step - loss: nan - acc: 0.4883
Epoch 99/100
    983/983 [==============================] - 0s 193us/step - loss: nan - acc: 0.4883
Epoch 100/100
    983/983 [==============================] - 0s 196us/step - loss: nan - acc: 0.4863

測試損失和准確性

test_loss,test_acc
Out[58]: (nan, 0.4615384661234342)

我還檢查了我的數據中是否有nan值

np.isnan(X_Train).any()
Out[5]: False
np.isnan(Y_Train).any()
Out[6]: False
np.isnan(X_Test).any()
Out[7]: False
np.isnan(Y_Test).any()
Out[8]: False

我的問題是,為什么我的訓練精度沒有提高,為什么損耗不大?為什么沒有一鍵編碼,輸出中的softmax也能正常工作?

注意1:我很抱歉我的數據很大,所以我不能在這里共享它,但是如果有某種方法可以在這里共享它,那么我准備好了。

注意2我的訓練數據中有很多零值

有時與Relu結合使用ReluSoftmax會造成數值麻煩,因為Relu可以產生與非常小的概率相對應的大正值。

嘗試使用tanh代替Relu

如果您丟失的NaN值,則表示輸入在函數域之外。 發生這種情況的原因有多種。 以下是找出原因的幾個步驟,

1)如果輸入不在功能域內,則確定這些輸入是什么。 跟蹤輸入值到成本函數的進度。

2)檢查輸入數據集中是否有任何null或nan值。 可以通過完成

DataFrame.isnull().any() 

3)更改輸入數據的比例。 將數據標准化為0和1之間的值即可開始訓練。

4)權重初始化的變更方法。

使用深度神經網絡很難指出確切的解決方案。 因此,嘗試上述方法,它應該使您對發生的問題有一個清晰的了解。

在這里,Softmax激活不是正確的選擇。 您在輸出層上只有一個神經元。

讓我們考慮一下如何定義softmax函數。(圖片來自wikepedia.org)

IMG
由於最后一層只有一個神經元, 西格瑪(z_i) 對於的所有值將為1 z_i

由於您正在使用sparse_categorical_crossentropy ,因此keras(或tensorflow)可以從logit的形狀推斷類的數量。 在keras(或tensorflow)中,logit的形狀假定為[BATCH_SIZE,NUM_CLASSES] 您的logit的形狀為[None,1],因此keras假設您的班級數量為1,但是您正在喂食多個班級(0或1),這會導致錯誤。

此處的正確激活函數是Sigmoid(tanh也可以通過將數據集目標更改為-1或1來工作)。 損失應該是binary_crossentropy

myModel = keras.Sequential([
    keras.layers.Dense(1000,activation=tf.nn.relu,input_shape=(19900,)),
    keras.layers.Dense(64, activation=tf.nn.relu),
    keras.layers.Dense(32, activation=tf.nn.relu),
    keras.layers.Dense(1, activation="sigmoid")
])

myModel.compile(optimizer='adam', loss='binary_crossentropy',metrics=['accuracy'])

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM