python - Keras - 摘要直方图 LSTM 中的 Nan

标签 python tensorflow keras lstm activation-function

我使用 Keras 编写了一个 LSTM 模型,并使用了 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])

我的数据是一个平衡的二进制标记集。即:50% 标记为 1 50% 标记为 0。我在 LeakyReLU 激活之前对 LSTM 层使用了 activation='linear',类似于 this example我在 GitHub 上找到了。

模型在该配置中抛出 Nan in summary histogram 错误。将 LSTM 激活更改为 activation='sigmoid' 效果很好,但似乎是错误的做法。

阅读 this StackOverflow问题建议“在计算损失时引入一个小值”,我只是不确定如何在内置损失函数上做到这一点。

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

更新: 我可以看到第一个 epoch 的损失是 nan

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 与作为 keras.engine.base_layer.Layer 的直接或间接子类的所有层一样有一个 add_loss 方法,可用于设置损失的起始值。

我建议对 LSTM 层执行此操作,看看它是否对您的结果有任何影响。

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

model.add(lstm_layer)

关于python - Keras - 摘要直方图 LSTM 中的 Nan,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53080289/

相关文章:

python - keras.losses.binary_crossentropy 输出张量的形状

python - 我对 'n' 和打印 ('n' 之间的区别感到困惑)

python - 域名下划线的问题

python - 使用 Keras 时,验证集中未见的类别会出现错误

python - 在 colab 中使用 keras_to_tpu_model 时,TPU 运行速度与 CPU 一样慢

python - 2D numpy 数组输入的 Tensorflow Keras Conv2D 错误

tensorflow - Keras:TPU 模型的所有操作都必须具有恒定的形状

python - 谷歌应用引擎 : Get entity key to use in a template

python - 使用 Matplotlib/Python 创建一堆极坐标图

tensorflow - 将 Dense 应用于 RNN 层中的每个输出