потеря кераса нан при использовании настраиваемой потери карты - PullRequest
0 голосов
/ 03 августа 2020

Я построил простую сеть lstm и использовал потерю сопоставления costom следующим образом:

def custom_mape(y_true, y_pred):
    mapes = K.switch(K.equal(y_true, 0), y_true, 100*K.abs(y_true - y_pred)/y_true)
    return K.mean(mapes, axis=-1)

И потеря оказалась nan в самом начале:

Model: "sequential_93"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
lstm_163 (LSTM)              (None, 14, 1)             296       
=================================================================
Total params: 296
Trainable params: 296
Non-trainable params: 0
_________________________________________________________________
Epoch 1/50
410/410 [==============================] - 3s 7ms/step - loss: nan - val_loss: nan
Epoch 2/50
410/410 [==============================] - 2s 6ms/step - loss: nan - val_loss: nan
Epoch 3/50
410/410 [==============================] - 2s 6ms/step - loss: nan - val_loss: nan
Epoch 4/50
410/410 [==============================] - 2s 6ms/step - loss: nan - val_loss: nan
Epoch 5/50
410/410 [==============================] - 2s 6ms/step - loss: nan - val_loss: nan
Epoch 6/50
410/410 [==============================] - 2s 5ms/step - loss: nan - val_loss: nan
Epoch 7/50
410/410 [==============================] - 3s 6ms/step - loss: nan - val_loss: nan
Epoch 8/50
410/410 [==============================] - 2s 5ms/step - loss: nan - val_loss: nan
Epoch 9/50
410/410 [==============================] - 2s 5ms/step - loss: nan - val_loss: nan
Epoch 10/50
410/410 [==============================] - 2s 5ms/step - loss: nan - val_loss: nan

Вот несколько способов, которые я пробовал:

  1. Когда я меняю K.abs (y_true - y_pred) / y_true на K.abs (y_true - y_pred), сеть работает.
  2. Чтобы выяснить если это градиентный взрыв, я пробовал clipvalue = 1, lr = 0 и batchsize = 1 отдельно. Потери остаются нано.

Кроме того, я использовал нормализацию min-max для y, и образец y выглядит следующим образом:

[[1.84368752e-05],
[9.86574098e-04],
[8.09853832e-04]]

1 Ответ

0 голосов
/ 03 августа 2020
K.abs(y_true - y_pred)/y_true

Здесь, если y_true равно 0, вы получите nan, потому что вы пытаетесь разделить на 0.

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