神经网络的验证准确性正在提高,但是在学习过程中,准确性,损失和val_loss大部分* nan *

时间:2020-09-16 00:53:14

标签: keras neural-network model loss-function

当我使用Keras API运行基本的神经网络时,验证准确性正在提高,但是准确性损失 val_loss 主要是 nan

运行环境和其他信息

  • Keras版本:“ 2.4.0”
  • TensorFlow版本:“ 2.3.0”
  • 操作系统:Ubuntu 20.04.1 LTS
  • GPU:Radeon RX 580系列
  • 在Jupyter Notebook中运行的Python(我知道没有库版本问题)
import tensorflow as tf
from tensorflow import *
from tensorflow.keras.callbacks import EarlyStopping 
from tensorflow.keras.utils import to_categorical

### data
tnc_data = pd.read_csv('https://www.dropbox.com/s/3mqdgfkz7fjtlf8/titanic_all_numeric.csv?dl=1')
### data prep
X = tnc_data.drop( 'survived', axis= 1 ).to_numpy()
X = np.asarray(X).astype(np.float32)
Y = to_categorical( tnc_data['survived'] )

tf.keras.backend.clear_session()
e_stop_monitor = EarlyStopping(patience= 10)

### model 
model1 = keras.Sequential()
model1.add( keras.layers.Dense( units= 10, activation= 'relu', input_shape= (X.shape[1],)  ) )
model1.add( keras.layers.Dense( units= 10, activation= 'relu' ) )
model1.add( keras.layers.Dense( units= 2, activation= 'softmax' ) )
model1.compile( optimizer= 'adam', loss= 'categorical_crossentropy', metrics= ['accuracy'] ) 
model1_training = model1.fit( x= X, y= Y, epochs= 15,
                              validation_split = 20./100,
                              callbacks= [e_stop_monitor],
                              verbose= 2 )

我观察到的结果是:

Epoch 1/15
23/23 - 0s - accuracy: 0.4823 - loss: nan - val_accuracy: 0.4637 - val_loss: nan
Epoch 2/15
23/23 - 0s - accuracy: nan - loss: nan - val_accuracy: 0.6425 - val_loss: nan
Epoch 3/15
23/23 - 0s - accuracy: nan - loss: 0.0000e+00 - val_accuracy: 0.6425 - val_loss: nan
Epoch 4/15
23/23 - 0s - accuracy: nan - loss: nan - val_accuracy: 0.6425 - val_loss: nan
Epoch 5/15
23/23 - 0s - accuracy: 0.5471 - loss: nan - val_accuracy: 0.6425 - val_loss: nan
Epoch 6/15
23/23 - 0s - accuracy: nan - loss: nan - val_accuracy: 0.6425 - val_loss: nan
Epoch 7/15
23/23 - 0s - accuracy: nan - loss: nan - val_accuracy: 0.6425 - val_loss: nan
Epoch 8/15
23/23 - 0s - accuracy: 0.5941 - loss: nan - val_accuracy: 0.5307 - val_loss: nan
Epoch 9/15
23/23 - 0s - accuracy: nan - loss: nan - val_accuracy: 0.5196 - val_loss: nan
Epoch 10/15
23/23 - 0s - accuracy: 0.6296 - loss: nan - val_accuracy: 0.5978 - val_loss: nan

谢谢大家的帮助...

2 个答案:

答案 0 :(得分:0)

首先,您应该比较培训,验证和测试数据的准确性。 如果训练精度低,则模型不会处理数据的复杂性,那么您应该调整参数。 如果验证准确性低,则表明您的模型过度拟合 如果测试准确性低,则意味着您需要更多的培训数据

答案 1 :(得分:0)

您的网络存在的问题是您有2个类别(0和1),但是您使用的类别交叉熵损失适用于两个以上类别。您可能应该使用二进制交叉熵损失。而且我不确定softmax在这种情况下的性能如何,请尝试添加Sigmoid函数而不是softmax。理想情况下,两者应给出相同的结果。