Python Keras-Nan汇总直方图LSTM

Python Keras-Nan汇总直方图LSTM,python,tensorflow,keras,lstm,activation-function,Python,Tensorflow,Keras,Lstm,Activation Function,我已经使用Keras和LeakyReLU高级激活编写了一个LSTM模型: # 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.sh

我已经使用Keras和LeakyReLU高级激活编写了一个LSTM模型:

    # 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])
我的数据是一个平衡的二进制标记集。i、 e:50%标记为1 50%标记为0。我在LeakyReLU激活之前的LSTM层中使用了
activation='linear'
,类似于我在GitHub上找到的

模型在该配置的摘要直方图中抛出
Nan
错误。将LSTM激活更改为
activation='sigmoid'
效果很好,但似乎是错误的

阅读问题建议“在计算损耗时引入一个小值”,我只是不知道如何在内置损耗函数上实现它

如有任何帮助/解释,将不胜感激

更新: 我可以看出,第一个纪元的损失是南

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
更新2 我已经将TensorFlow和Keras升级到1.12.0和2.2.4版本。没有效果

我还尝试按照@Oluwafemi Sule的建议在第一个LSTM层中添加损耗,这看起来是朝着正确方向迈出的一步,现在损耗在第一个历元上不是nan,但是,我仍然得到相同的错误。。。可能是因为其他nan值,如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
更新3 我试图仅用精度指标编译网络,但没有成功:

Epoch 1/300
260/260 [==============================] - 8s 29ms/step - loss: nan - acc: 0.5538 - val_loss: nan - val_acc: 0.0000e+00

这个答案是从在计算损失时引入一个小值的建议开始的

keras.layers.LSTM
as的所有直接或间接子类的层都有一个
add_loss
方法,可用于设置损失的起始值

我建议对LSTM层执行此操作,看看它是否会对结果产生任何影响

lstm_layer = LSTM(8, return_sequences=True, activation='linear')
lstm_layer.add_loss(1.0)

model.add(lstm_layer)

我曾经遇到过类似的问题,但我的问题是由于数据集中的Nan值,我不确定你的梯度是否会爆炸,因为LeakyRelu本身不足以使它收敛。但通常有一个名为“clipnorm”或“clipvalue”的选项,您可以将其传递给所有优化器。这有助于剪裁渐变,通常用于找到摆脱局部极小值的方法。你可以在这里试试,看看有没有什么不同?您使用的是什么版本的Keras和TensorFlow?Keras 2.2.2,tf 1.5。0@ShlomiSchwartz只需将
clipnorm=1.0
参数传递给优化器,例如
Adam(…,clipnorm=1.0)
。谢谢您的回答。这看起来是朝着正确的方向迈出的一步,现在在第一个纪元我可以看到
260/260[==============================]-7s26ms/step-loss:1.9099-acc:0.5077-precision:0.5235-recall:0.6544-f1:0.5817-val\u loss:nan-val\u acc:0.5172-val\u precision:35.0000-val\u recall:0.9722-val\u f1:nan
,然而,我仍然得到相同的错误。。。可能是因为其他nan值,比如val_loss/val_f1?