Ошибка при запуске модели LSTM, потеря: значения NaN - PullRequest
0 голосов
/ 18 мая 2019

Моя модель LSTM, использующая Keras и Tensorflow, дает значения loss: nan.

Я пытался уменьшить скорость обучения, но все еще получаю нано и уменьшая общую точность, а также использовал np.any(np.isnan(x_train)), чтобы проверить значения нано, которые я могу представить себе (нано не было найдено). Я также читал о взрывающихся градиентах и ​​не могу найти ничего, что могло бы помочь с моей конкретной проблемой.

Думаю, у меня есть представление о том, где может быть проблема, но я не совсем уверен. Это процесс, который я реализовал для сборки x_train Например:

a = [[1,0,..0], [0,1,..0], [0,0,..1]]
a.shape() # (3, 20)

b = [[0,0,..1], [0,1,..0], [1,0,..0], [0,1,..0]]
b.shape() # (4, 20)

Чтобы убедиться, что фигуры одинаковы, я добавляю вектор [0,0,..0] (все нули) к a, поэтому форма теперь (4,20).

a и b добавляются, чтобы придать трехмерному массиву форму (2,4,20), и это формирует x_train. Но я думаю, что добавление пустых векторов нулей по какой-то причине дает мне loss: nan во время тренировки моей модели. Это где я могу пойти не так?

n.b. a+b является массивом NumPy, и мой фактический x_train.shape (1228, 1452, 20)

• Изменить • model.summary() добавлено ниже:

x_train shape: (1228, 1452, 20)
y_train shape: (1228, 1452, 8)
x_val shape: (223, 1452, 20)
x_val shape: (223, 1452, 8)
Model: "sequential"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
unified_lstm (UnifiedLSTM)   (None, 1452, 128)         76288     
_________________________________________________________________
batch_normalization_v2 (Batc (None, 1452, 128)         512       
_________________________________________________________________
unified_lstm_1 (UnifiedLSTM) (None, 1452, 128)         131584    
_________________________________________________________________
batch_normalization_v2_1 (Ba (None, 1452, 128)         512       
_________________________________________________________________
dense (Dense)                (None, 1452, 32)          4128      
_________________________________________________________________
dense_1 (Dense)              (None, 1452, 8)           264       
=================================================================
Total params: 213,288
Trainable params: 212,776
Non-trainable params: 512

Скриншот Nan ниже: enter image description here

Ответы [ 3 ]

0 голосов
/ 18 мая 2019

Вместо того, чтобы заполнять все нули вектором, вы должны использовать фиктивную функцию.То есть, ваш вектор признаков с одним горячим расширением увеличит размер до (21,), например, [0, 0, 0, ..., 1] размера 21 с последним измерением для фиктивного заполнения.

Я также советую вам вместо этого использовать ввод на основе индексаявного вектора с одним горячим вектором, где каждый вектор с одним горячим током может быть заменен индексом его 1, например, [0, 0, 1, ..., 0] становится 2. Keras поддерживают этот стиль ввода, основанный на индексе, своим слоем внедрения.Это будет проще в использовании и более эффективным в вычислительном отношении.

0 голосов
/ 21 мая 2019

Решение заключается в использовании Masking() слоев, доступных в кератах с mask_value=0. Это связано с тем, что при использовании пустых векторов они вычисляются в потерю с использованием Masking(), как указано в кератах, векторы заполнения пропускаются и не включаются.

Согласно документации keras:

' Если все объекты для данного временного шага выборки равны mask_value, тогда временный шаг выборки будет маскирован (пропущен) во всех нижележащих слоях (если они поддерживают маскирование) '

0 голосов
/ 18 мая 2019

Я советую вам проверить следующее: -

  1. Вывод вашего уровня нормализации партии.Однажды я столкнулся с подобной проблемой, когда потери стали «нан».Когда я проверил вывод нормализации, это были все нули.Может быть, это то, что сделало потерю «нан».
  2. Возможная причина для NaN может быть слишком высокой из скорости обучения.Попробуйте уменьшить его немного и проверьте вывод.
  3. Если вы используете RMSProp, попробуйте вместо этого Адам.
  4. Поскольку ваш слой dense_1 имеет форму (Нет, 8), я предполагаю, что выработают над какой-то проблемой классификации.Потому что здесь мы используем потерю журналов, иногда также возникают ошибки точности.Если вы используете float16, измените точность на float32.
...