Python Keras-Nan汇总直方图LSTM
我已经使用Keras和LeakyReLU高级激活编写了一个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
# 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?