1

我正在尝试使用 LSTM 网络分析 EEG 数据,我将数据分成 4 秒的片段,从而产生大约 17000 个数据样本。为此,我在下面构建了以下网络:

def load_model():
        model = Sequential()
        model.add(LSTM(5,recurrent_dropout=0.1,activation="relu",input_shape=(data_length, number_of_channels),
                    return_sequences=True, kernel_regularizer=tf.keras.regularizers.l1_l2(l1=0.00001, l2=0.00001)))
        model.add(Dense(512, activation = 'relu'))
        model.add(Dense(512, activation = 'relu'))
        model.add(Dropout(0.2))
        model.add(Dense(units=1, activation="sigmoid"))
        model.compile(optimizer=Adam(learning_rate=0.00001,clipvalue=1.5), loss='binary_crossentropy',
                    metrics=['accuracy', F1_scores,Precision,Sensitivity,Specificity],run_eagerly=True)
        return model

训练时,损失从前几批立即变为 nan。为避免这种情况,我尝试添加经常性 dropout、le/l2 正则化、裁剪渐变以及正常 dropout。我还尝试更改学习率和批量大小的值。唯一有效的是经常性 dropout 为 0.9 并且 l1 和 l2 得分较低(0.00001),我还必须将 LSTM 网络中的单元数从最初的 30 降低到 5。有没有其他方法可以避免在不降低这么多特征并且对梯度有高惩罚的情况下这样做的损失?

我正在使用微软提供的 tensorflow-directml 和 tensorflow 版本 1.15.1 和 keras 2.7.0。

4

1 回答 1

1

通过将 LSTM 层的内核初始化为较小的值来解决该问题。这是通过更改以下行来完成的:

model.add(LSTM(5,recurrent_dropout=0.1,activation="relu",input_shape=(data_length, number_of_channels),
                    return_sequences=True, kernel_regularizer=tf.keras.regularizers.l1_l2(l1=0.00001, l2=0.00001)))

至:

model.add(LSTM(5,recurrent_dropout=0.2, kernel_initializer=tf.keras.initializers.RandomNormal(mean=0.0, stddev=0.00001, seed=7)
                    ,activation="relu",input_shape=(data_length, number_of_channels),return_sequences=True))
于 2021-12-03T17:40:09.973 回答