Потеря эпох наступает как NaN - PullRequest
0 голосов
/ 11 июля 2020
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

Я сделал эту классификацию нейронной сети для прогнозирования хронической c болезни почек. Потери, в то время как эпохи приходят как NaN, хотя у меня нет значений NaN в моем наборе данных

Мой набор данных: - https://drive.google.com/file/d/1iDOc5RUBq_zUOHPfspPDBMxvKIKfRIsr/view?usp=sharing

Вы можете редактировать мой код здесь: - https://colab.research.google.com/drive/1lXB7QoowiF3WaZ2LJV68r3A-a616v6hO?usp=sharing

1 Ответ

1 голос
/ 11 июля 2020

У вас есть 1 запись в строке №403 вашего набора данных (во 2-й ячейке), которая вызывает проблему градиента NaN. Просто удалите его из своего набора данных, и вам будет удобно go.

Вдобавок: я удалил 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, чтобы иметь дело с фиктивными переменными. Надеюсь, это решит вашу проблему :)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...