Потеря обучения - это Nan, но все данные обучения находятся в диапазоне без нуля

Когда я выполняю свой model.fit(x_train_lstm, y_train_lstm, epochs=3, shuffle=False, verbose=2)

Я всегда терплю поражение, как няня:

Epoch 1/3
73/73 - 5s - loss: nan - accuracy: 0.5417 - 5s/epoch - 73ms/step
Epoch 2/3
73/73 - 5s - loss: nan - accuracy: 0.5417 - 5s/epoch - 74ms/step
Epoch 3/3
73/73 - 5s - loss: nan - accuracy: 0.5417 - 5s/epoch - 73ms/step

Мой x_training сформирован (2475, 48), y_train сформирован (2475,)

  • Я получаю свой входной набор поездов в (2315, 160, 48), поэтому 2315 наборов обучающих данных, 160 в качестве временного окна обратной петли, 48 функций
  • соответственно, y_train равен 0 или 1 в форме (2315, 1)

Все в диапазоне (-1,1): Потеря обучения - это Nan, но все данные обучения находятся в диапазоне без нуля

Моя модель такая:

Model: "sequential_2"
_________________________________________________________________
 Layer (type)                Output Shape              Param #   
=================================================================
 lstm_6 (LSTM)               (None, 160, 128)          90624     
                                                                 
 dropout_4 (Dropout)         (None, 160, 128)          0         
                                                                 
 lstm_7 (LSTM)               (None, 160, 64)           49408     
                                                                 
 dropout_5 (Dropout)         (None, 160, 64)           0         
                                                                 
 lstm_8 (LSTM)               (None, 32)                12416     
                                                                 
 dense_2 (Dense)             (None, 1)                 33        
                                                                 
=================================================================
Total params: 152,481
Trainable params: 152,481
Non-trainable params: 0
  • Я пробовал разные единицы LSTM: 48, 60, 128, 160, ни одна из них не работает.
  • Проверяю свои тренировочные данные, все они в диапазоне (-1,1)
  • В моем наборе данных нет нуля, x_train.isnull().values.any() выводит False

Теперь я понятия не имею, где я могу попробовать больше ~

Код моей модели:

from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, LSTM
from tensorflow.keras.layers import Dropout

def create_model(win = 100, features = 9):
    model = Sequential()
    model.add(LSTM(units=128, activation='relu', input_shape=(win, features),
        return_sequences=True))
    model.add(Dropout(0.1))
    model.add(LSTM(units=64, activation='relu', return_sequences=True))
    model.add(Dropout(0.2))

    # no need return sequences from 'the last layer'
    model.add(LSTM(units=32))

    # adding the output layer
    model.add(Dense(units=1, activation='sigmoid'))

    # may also try mean_squared_error
    model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])
    return model

здесь я рисую несколько образцов train_y: Потеря обучения - это Nan, но все данные обучения находятся в диапазоне без нуля

Как вы компилируете свою модель? Функция потери, выход/активация последнего слоя - проверено? Можно ли делиться воспроизводимым материалом?

M.Innat 16.03.2022 10:56

@M.Innat Я только что загрузил код своей модели для справки.

yunfei 16.03.2022 11:45
Udacity Nanodegree Capstone Project: Классификатор пород собак
Udacity Nanodegree Capstone Project: Классификатор пород собак
Вы можете ознакомиться со скриптами проекта и данными на github .
2
2
70
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Две вещи: попробуйте нормализовать данные временных рядов и использовать relu, поскольку функция активации для lstm слоев не является «традиционной». Проверьте этот сообщение для получения дополнительной информации. Пример:

from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, LSTM
from tensorflow.keras.layers import Dropout
import tensorflow as tf

layer = tf.keras.layers.Normalization(axis=-1)
x = tf.random.normal((500, 100, 9))
y = tf.random.uniform((500, ), dtype=tf.int32, maxval=2)
layer.adapt(x)

def create_model(win = 100, features = 9):
    model = Sequential()
    model.add(layer)
    model.add(LSTM(units=128, activation='tanh', input_shape=(win, features),
        return_sequences=True))
    model.add(Dropout(0.1))
    model.add(LSTM(units=64, activation='tanh', return_sequences=True))
    model.add(Dropout(0.2))

    model.add(LSTM(units=32))

    model.add(Dense(units=1, activation='sigmoid'))

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

model = create_model()

model.fit(x, y, epochs=20)

Я только что попробовал танх, релу, сигмоид, без активации, не работает! Кстати, мой набор данных нормализован, как я упоминал в своем описании.

yunfei 16.03.2022 12:44

Можете показать часть model.fit?

AloneTogether 16.03.2022 12:45

model.fit(x_train_lstm, y_train_lstm, epochs=3, batch_size=64, shuffle=False, verbose=1)

yunfei 16.03.2022 12:45

а образец x_train_lstm? и y_train_lstm?

AloneTogether 16.03.2022 12:46

y_train_lstm просто 0 или 1 как мои метки, x_train_lstm в форме (2315, 160, 48), в диапазоне (-1, 1), в моем описании есть график x_train

yunfei 16.03.2022 12:47

Образец X_TRAIN похож на: массив ([[[- 0,090212, -0.04325221, 0,01507063, ..., 0.1007919, 0.13871902, 0.10845089], [-0.11270548, -0.02728808, ..., 0.10102842, 0.13952859, 0.11148659], [-0,0815856 , -0,08153108, -0,02805241, ..., 0,10170061, 0,13986657, 0,11421693], ...,

yunfei 16.03.2022 12:50

Да, я уверен, я построил y_train, смотрите мое обновленное описание

yunfei 16.03.2022 12:59

Хорошо, я спрашиваю, потому что сама ваша модель в порядке. Это означает, что это должно быть что-то с вашими данными.

AloneTogether 16.03.2022 12:59

У меня работала простая версия, в этой версии мое изменение перемещалось с 9 функций на 48 из моего набора данных, не уверен, что я пропустил какой-либо параметр

yunfei 16.03.2022 13:01

Эй, пожалуйста, ознакомьтесь с моим обновленным ответом, это из-за np.inf

yunfei 17.03.2022 10:14
Ответ принят как подходящий

Обновление от 17 марта 2022 г.

После дальнейшей отладки я в конце концов обнаружил, что проблема на самом деле из-за того, что моя недавно добавленная функция содержит np.inf, после того, как я удалю эти строки, моя проблема решена, теперь я могу видеть значение потери.

6/6 [==============================] - 2s 50ms/step - loss: 0.6936 - accuracy: 0.5176

Обратите внимание, что np.inf имеет символ, поэтому убедитесь, что оба np.inf и -np.inf удалены:

all_dataset = all_dataset[all_dataset.feature_issue != np.inf]
all_dataset = all_dataset[all_dataset.feature_issue != -np.inf]

2022.Мар 16

После некоторой отладки я обратился к двум моим новым добавленным функциям, которые действительно вызывают проблему. Итак, проблема связана с данными, но, в отличие от других, мои данные не содержат ни nan, ни выхода за пределы диапазона (изначально я думал, что все данные нужно нормализовать)

Но я пока не могу сказать причину, так как они выглядят хорошо

Я продолжу исследования завтра, любые советы приветствуются!

Другие вопросы по теме