Keras - Nan em resumo histograma LSTM
Eu escrevi um modelo LSTM usando Keras e usando a ativação avançada do LeakyReLU:
# ADAM Optimizer with learning rate decay
opt = optimizers.Adam(lr=0.0001, beta_1=0.9, beta_2=0.999, epsilon=1e-08, decay=0.0001)
# build the model
model = Sequential()
num_features = data.shape[2]
num_samples = data.shape[1]
model.add(
LSTM(16, batch_input_shape=(None, num_samples, num_features), return_sequences=True, activation='linear'))
model.add(LeakyReLU(alpha=.001))
model.add(Dropout(0.1))
model.add(LSTM(8, return_sequences=True, activation='linear'))
model.add(Dropout(0.1))
model.add(LeakyReLU(alpha=.001))
model.add(Flatten())
model.add(Dense(1, activation='sigmoid'))
model.compile(loss='binary_crossentropy', optimizer=opt,
metrics=['accuracy', keras_metrics.precision(), keras_metrics.recall(), f1])
Meus dados são um conjunto rotulado binário equilibrado. ou seja: 50% rotulado 1 50% rotulado 0. Eu useiactivation='linear'
para as camadas LSTM anteriores à ativação do LeakyReLU, semelhante aeste exemplo Encontrei no GitHub.
O modelo lançaNan in summary histogram
erro nessa configuração. Alterando as ativações do LSTM paraactivation='sigmoid'
funciona bem, mas parece a coisa errada a se fazer.
Leiturathis StackOverflow pergunta sugerida "introduzindo um pequeno valor ao calcular a perda", Não sei bem como fazê-lo em uma função de perda intern
Qualquer ajuda / explicação seria apreciada.
Atualizar Eu posso ver que a perda é nan na primeira época
260/260 [==============================] - 6s 23ms/step -
loss: nan - acc: 0.5000 - precision: 0.5217 - recall: 0.6512 - f1: nan - val_loss: nan - val_acc: 0.0000e+00 - val_precision: -2147483648.0000 - val_recall: -49941480.1860 - val_f1: nan
Update 2 Atualizei o TensorFlow e o Keras para as versões 1.12.0 e 2.2.4. Não houve efeito.
Eu também tentei adicionar uma perda à primeira camada LSTM, como sugerido por @Oluwafemi Sule, parece um passo na direção certa, agora a perda não é nan na primeira época, no entanto, ainda recebo o mesmo erro .. provavelmente por causa de outros valores nan, como o val_loss / val_f1.
[==============================] - 7s 26ms/step -
loss: 1.9099 - acc: 0.5077 - precision: 0.5235 - recall: 0.6544 - f1: 0.5817 - val_loss: nan - val_acc: 0.5172 - val_precision: 35.0000 - val_recall: 0.9722 - val_f1: nan
Update 3entei compilar a rede apenas com a métrica de precisão, sem sucess
Epoch 1/300
260/260 [==============================] - 8s 29ms/step - loss: nan - acc: 0.5538 - val_loss: nan - val_acc: 0.0000e+00