Модель потерь Кераса, возвращающая нан - PullRequest
0 голосов
/ 19 марта 2020

Я тренирую автоэнкодер в кератах, который определяется следующим образом:

model = Sequential()
model.add(LSTM(100, activation='relu', input_shape=(430, 3)))
model.add(RepeatVector(430))
model.add(LSTM(100, activation='relu', return_sequences=True))
model.add(TimeDistributed(Dense(3)))
model.compile(optimizer='adam', loss='mean_squared_error', metrics=['accuracy'])
print(model.summary())

context_paths = loadFile()
X_train, X_test = train_test_split(context_paths, test_size=0.20)

print('Fitting model.')
history = model.fit(X_train, X_train, epochs=1, batch_size=8, verbose=1, shuffle=True, validation_data=(X_test, X_test))

predict_sample = X_train[0].reshape((1, 430, 3))

predict_output = model.predict(predict_sample, verbose=0)
print(predict_output[0, :, 0])

Этот код не выдает никаких ошибок, но когда я его запускаю, потери равны nan. Я проверил некоторые вопросы по SO и обнаружил, что эта проблема возникает, когда:

  • nan или бесконечные значения -> Я проверил свои входные данные с numpy.isnan(myarray).any(), который возвратил False, поэтому Я также сделал numpy.isfinite(myarray).any(), что вернуло True, поэтому я предполагаю, что мои данные в порядке
  • размер пакета слишком велик -> Я уменьшил с 32 до 8, мало помогло
  • размер слоя слишком велик -> Я уменьшил со 100 до 24, мало помогло

Вот изображение первых нескольких партий: enter image description here

Здесь потеря гигантская c, но я не уверен, что ее вызывает. Диапазон чисел в моем наборе данных достигает пределов int32. Также мои данные дополняются нулями.

1 Ответ

2 голосов
/ 19 марта 2020

У вас явно есть огромный диапазон данных. Вы переполняете все, как вы сами наблюдали в своем диапазоне:

Диапазон чисел в моем наборе данных достигает пределов int32

Нормализуйте свои данные перед использованием это в модели.

Правильная проверка для бесконечных значений должна быть:

numpy.isfinite(myarray).all()

Вы можете попробовать преобразование для диапазона от 0 до 1 (необходимо сначала преобразовать в float):

xMax = x_train.max()
xMin = x_train.min()
xRange = xMax - xMin

x_train = (x_train - xMin) / xRange
x_test = (x_test - xMin) / xRange

Сделайте то же самое с y.

Вы также можете попробовать Z-преобразование:

xMean = x_train.mean()
xStd = x_train.std()

x_train = (x_train - xMean) / xStd
x_test = (x_test - xMean) / xStd
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...