【问题标题】:Epochs loss is coming as NaNEpochs 损失即将到来为 NaN
【发布时间】:2020-10-31 20:16:32
【问题描述】:
import tensorflow as tf
from tensorflow import keras
import pandas as pd
from sklearn.model_selection import train_test_split
import numpy as np
xi=pd.read_csv(r'/content/ckd_full.csv')
xi=xi.drop(columns=['sg','su','pc','pcc','pcv','rbcc','wbcc'])
y=xi[['class']]
y['class']=y['class'].replace(to_replace=(r'ckd',r'notckd'), value=(1,0))
x=xi.drop(columns=['class'])


x['rbc']=x['rbc'].replace(to_replace=(r'normal',r'abnormal'), value=(1,0))
x['ba']=x['ba'].replace(to_replace=(r'present',r'notpresent'), value=(1,0))
x['htn']=x['htn'].replace(to_replace=(r'yes',r'no'), value=(1,0))
x['dm']=x['dm'].replace(to_replace=(r'yes',r'no'), value=(1,0))
x['cad']=x['cad'].replace(to_replace=(r'yes',r'no'), value=(1,0))
x['pe']=x['pe'].replace(to_replace=(r'yes',r'no'), value=(1,0))
x['ane']=x['ane'].replace(to_replace=(r'yes',r'no'), value=(1,0))
x['appet']=x['appet'].replace(to_replace=(r'good',r'poor'), value=(1,0))
x[x=="?"]=np.nan
d=['age', 'bp', 'al', 'rbc', 'ba', 'bgr', 'bu', 'sc', 'sod', 'pot', 'hemo', 'htn', 'dm','cad', 'appet', 'pe', 'ane']

for i in d:
  x[i] = x[i].astype(float)
x.fillna(x.median(),inplace=True) 
xtrain, xtest, ytrain, ytest = train_test_split(x, y, test_size=0.025)
#begin the model


model=keras.models.Sequential()
model.add(keras.layers.Dense(150,input_dim = 17, activation=tf.nn.relu))
#model.add(keras.layers.Dropout(0.5))
model.add(keras.layers.Dense(100,input_dim = 17, activation=tf.nn.relu))
model.add(keras.layers.Dense(50,input_dim = 17, activation=tf.nn.relu))
model.add(keras.layers.Dense(10,input_dim = 17, activation=tf.nn.relu))
model.add(keras.layers.Dense(5,input_dim = 17, activation=tf.nn.relu))
model.add(keras.layers.Dense(1, activation=tf.nn.sigmoid))
model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy']) # specifiying hyperparameters
xtrain_tensor = tf.convert_to_tensor(xtrain, dtype=tf.float32)
ytrain_tensor = tf.convert_to_tensor(ytrain, dtype=tf.float32)
model.fit(xtrain_tensor , ytrain_tensor , epochs=100, batch_size=128, validation_split = 0.15, shuffle=True, verbose=2) # load the model
#es = tf.keras.callbacks.EarlyStopping(monitor='accuracy', mode='min', verbose=1,patience=5)
model.save('NephrologistLite') # save the model with a unique name
myModel=tf.keras.models.load_model('NephrologistLite')  # make an object of the model

我制作了这个分类神经网络来预测慢性肾病。尽管我的数据集中没有任何 NaN 值,但损失以 NaN 的形式出现

我的数据集:- https://drive.google.com/file/d/1iDOc5RUBq_zUOHPfspPDBMxvKIKfRIsr/view?usp=sharing

你可以在这里编辑我的代码:- https://colab.research.google.com/drive/1lXB7QoowiF3WaZ2LJV68r3A-a616v6hO?usp=sharing

【问题讨论】:

  • A value is trying to be set on a copy of a slice from a DataFrame. Try using .loc[row_indexer,col_indexer] = value instead 那是你的错误。
  • 我做了 label=xi.iloc[:,18] print(label)
  • 但出现错误IndexError: single positional indexer is out-of-bounds

标签: python-3.x pandas keras deep-learning keras-layer


【解决方案1】:

您在数据集的第 403 行(第 2 个单元格)中有 1 条记录,这导致了 NaN 梯度问题。只需将其从您的数据集中删除即可。

此外: 我从隐藏层中删除了 input_dims,因为它不是必需的。试图使代码尽可能接近您的代码。

import tensorflow as tf
from tensorflow import keras
import pandas as pd
from sklearn.model_selection import train_test_split
import numpy as np

xi=pd.read_csv('ckd_full.csv')
xi=xi.drop(columns=['sg','su','pc','pcc','pcv','rbcc','wbcc'])
y=xi[['class']]
y['class']=y['class'].replace(to_replace=(r'ckd',r'notckd'), value=(1,0))
x=xi.drop(columns=['class'])


x['rbc']=x['rbc'].replace(to_replace=(r'normal',r'abnormal'), value=(1,0))
x['ba']=x['ba'].replace(to_replace=(r'present',r'notpresent'), value=(1,0))
x['htn']=x['htn'].replace(to_replace=(r'yes',r'no'), value=(1,0))
x['dm']=x['dm'].replace(to_replace=(r'yes',r'no'), value=(1,0))
x['cad']=x['cad'].replace(to_replace=(r'yes',r'no'), value=(1,0))
x['pe']=x['pe'].replace(to_replace=(r'yes',r'no'), value=(1,0))
x['ane']=x['ane'].replace(to_replace=(r'yes',r'no'), value=(1,0))
x['appet']=x['appet'].replace(to_replace=(r'good',r'poor'), value=(1,0))
x[x=="?"]=np.nan
d=['age', 'bp', 'al', 'rbc', 'ba', 'bgr', 'bu', 'sc', 'sod', 'pot', 'hemo', 'htn', 'dm','cad', 'appet', 'pe', 'ane']

for i in d:
  x[i] = x[i].astype(float)
x.fillna(x.median(),inplace=True) 
xtrain, xtest, ytrain, ytest = train_test_split(x, y, test_size=0.15)

#begin the model
model=keras.models.Sequential()
model.add(keras.layers.Dense(150,input_dim = 17, activation=tf.nn.relu))
#model.add(keras.layers.Dropout(0.5))
model.add(keras.layers.Dense(100, activation=tf.nn.relu))
model.add(keras.layers.Dense(50, activation=tf.nn.relu))
model.add(keras.layers.Dense(10, activation=tf.nn.relu))
model.add(keras.layers.Dense(5, activation=tf.nn.relu))
model.add(keras.layers.Dense(1, activation=tf.nn.sigmoid))
model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy']) # specifiying hyperparameters
xtrain_tensor = tf.convert_to_tensor(xtrain, dtype=tf.float32)
ytrain_tensor = tf.convert_to_tensor(ytrain, dtype=tf.float32)
model.fit(xtrain_tensor , ytrain_tensor , epochs=100, batch_size=128, validation_split = 0.15, shuffle=True, verbose=2) # load the model
model.evaluate(xtest, ytest)
#es = tf.keras.callbacks.EarlyStopping(monitor='accuracy', mode='min', verbose=1,patience=5)
#model.save('NephrologistLite') # save the model with a unique name
#myModel=tf.keras.models.load_model('NephrologistLite')  # make an object of the model       

这些是我收到的结果:

Epoch 99/100
3/3 - 0s - loss: 0.2782 - accuracy: 0.8893 - val_loss: 0.2868 - val_accuracy: 1.0000
Epoch 100/100
3/3 - 0s - loss: 0.2706 - accuracy: 0.9343 - val_loss: 0.2926 - val_accuracy: 1.0000

尽管您的模型以 100% 的验证准确度表现得非常好,但我还是建议删除一些层并使用 tanh 层来处理虚拟变量。 希望能解决你的问题:)

【讨论】:

  • 感谢您的大力帮助!你帮了我很多。我非常感谢你?
  • 我很高兴能帮到你!继续让我参与你未来的发展:)
  • 我可以添加 dropout 层并提前停止吗?
  • 你不会用你建立的模型过度拟合你的数据。对于无法在不过度拟合的情况下捕获数据中的重要模式的大型数据集,Dropout 层可能更有用。提前停止也是如此,因为您不会尝试为大量时期训练您的 NN。因此,我的回答是,尽管您可以添加 dropout 层和提前停止,但在您的情况下没有必要。
猜你喜欢
  • 2017-04-10
  • 1970-01-01
  • 2021-09-06
  • 1970-01-01
  • 2018-04-25
  • 1970-01-01
  • 2017-06-22
  • 2021-03-26
  • 1970-01-01
相关资源
最近更新 更多