Нан значения в потерях в модели керас - PullRequest
0 голосов
/ 20 мая 2019

У меня есть следующие данные формы

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 В моих тренировочных данных много нулевых значений

Ответы [ 3 ]

2 голосов
/ 20 мая 2019

Иногда с Keras комбинация Relu и Softmax вызывает численные проблемы, поскольку Relu может давать большие положительные значения, соответствующие очень малым вероятностям.

Попробуйте использовать tanh вместо Relu

1 голос
/ 20 мая 2019

Активация Softmax здесь не правильный выбор.У вас есть только один нейрон на выходном слое.

Давайте рассмотрим, как определяется функция softmax. (Изображение с wikepedia.org)

img.
Поскольку на последнем слое имеется только один нейрон, sigma(z_i) будет1 для всех значений z_i.

Поскольку вы используете sparse_categorical_crossentropy, керас (или тензор потока) может вывести количество классов по форме логитов. В кератах (или тензорных потоках) предполагается, что форма логитов [BATCH_SIZE, NUM_CLASSES] .Форма ваших логитов - [Нет, 1], поэтому keras предполагает, что количество ваших классов равно 1, но вы кормите более одного класса (0 или 1), и это вызывает ошибку.

Правильная функция активации здесь - сигмоидальная (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'])
1 голос
/ 20 мая 2019

Если вы получаете значения NaN с потерями, это означает, что ввод за пределами функциональной области. Есть несколько причин, почему это может произойти. Вот несколько шагов, чтобы найти причину,

1) Если вход находится за пределами области действия, определите, что это за вход. Отследите последовательность ввода значений в функцию стоимости.

2) Проверьте, есть ли какие-либо значения null или nan во входных данных. Может быть достигнуто с помощью

DataFrame.isnull().any() 

3) Изменить масштабирование входных данных. Нормализация данных от 0 до 1 начала тренировки.

4) Измените метод инициализации веса.

Трудно указать точное решение с Deep Neural Networks. Поэтому попробуйте описанные выше методы, и они должны дать вам четкое представление о том, что происходит не так.

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