Когда я выполняю свой 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,)
Моя модель такая:
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
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
@M.Innat Я только что загрузил код своей модели для справки.
Две вещи: попробуйте нормализовать данные временных рядов и использовать 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)
Я только что попробовал танх, релу, сигмоид, без активации, не работает! Кстати, мой набор данных нормализован, как я упоминал в своем описании.
Можете показать часть model.fit
?
model.fit(x_train_lstm, y_train_lstm, epochs=3, batch_size=64, shuffle=False, verbose=1)
а образец x_train_lstm? и y_train_lstm?
y_train_lstm просто 0 или 1 как мои метки, x_train_lstm в форме (2315, 160, 48), в диапазоне (-1, 1), в моем описании есть график x_train
Образец 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], ...,
Да, я уверен, я построил y_train, смотрите мое обновленное описание
Хорошо, я спрашиваю, потому что сама ваша модель в порядке. Это означает, что это должно быть что-то с вашими данными.
У меня работала простая версия, в этой версии мое изменение перемещалось с 9 функций на 48 из моего набора данных, не уверен, что я пропустил какой-либо параметр
Эй, пожалуйста, ознакомьтесь с моим обновленным ответом, это из-за np.inf
Обновление от 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, ни выхода за пределы диапазона (изначально я думал, что все данные нужно нормализовать)
Но я пока не могу сказать причину, так как они выглядят хорошо
Я продолжу исследования завтра, любые советы приветствуются!
Как вы компилируете свою модель? Функция потери, выход/активация последнего слоя - проверено? Можно ли делиться воспроизводимым материалом?