我已经使用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'
,类似于我在GitHub上找到的this example。
模型在该配置中引发Nan in summary histogram
错误。将LSTM激活更改为activation='sigmoid'
效果很好,但似乎做错了事。
阅读this StackOverflow问题提示“在计算损失时引入一个小值” ,我不确定如何在内置损失函数中进行此操作。
任何帮助/解释将不胜感激。
更新: 我可以看到损失在第一个时期是微不足道的
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值,例如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
答案 0 :(得分:2)
这个答案从建议开始,即在计算损失时引入一个小的值。
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)