如何在 python 中处理具有许多特性的 LSTM?

Posted

技术标签:

【中文标题】如何在 python 中处理具有许多特性的 LSTM?【英文标题】:How to handle LSTMs with many features in python? 【发布时间】:2020-07-06 14:35:09 【问题描述】:

我有一个二元分类问题。我使用以下 keras 模型进行分类。

input1 = Input(shape=(25,6))
x1 = LSTM(200)(input1)
input2 = Input(shape=(24,6))
x2 = LSTM(200)(input2)
input3 = Input(shape=(21,6))
x3 = LSTM(200)(input3)
input4 = Input(shape=(20,6))
x4 = LSTM(200)(input4)
x = concatenate([x1,x2,x3,x4])
x = Dropout(0.2)(x)
x = Dense(200)(x)
x = Dropout(0.2)(x)
output = Dense(1, activation='sigmoid')(x)

但是,我得到的结果非常糟糕。我认为原因是我的功能太多,因此需要在concatenate之后有更多改进的层。 我还在考虑在 concatenate 之后使用 flatten() 层是否有帮助。 无论如何,由于我是深度学习的新手,我不太确定如何使它成为更好的模型。

如果需要,我很乐意提供更多详细信息。

【问题讨论】:

【参考方案1】:

以下是我的建议

    删除所有防止过拟合的东西,例如 Dropout 和正则化器。可能发生的情况是,您的模型可能无法使用给定层捕获数据的复杂性,因此您需要确保您的模型能够在添加正则化器之前先过拟合。

    现在尝试增加 Dense 层的数量和每层中的神经元数量,直到您看到一些改进。还有一种可能是您的数据太嘈杂,或者您只有很少的数据可以训练模型,因此您甚至无法产生有用的预测。

    现在如果您幸运并且可以看到过拟合,您可以添加 Dropout 和正则化器。

由于每个神经网络都是基于梯度的算法,因此您最终可能会处于局部最小值。您可能还需要以不同的初始权重多次运行该算法才能获得良好的结果,或者您可以更改损失函数,以便遇到局部最小值为全局最小值的凸问题。

如果你不能取得更好的结果

您可能需要尝试不同的拓扑,因为 LSTM 只是尝试对假设具有马尔可夫属性的系统进行建模。您可以查看nested-LSTM 或类似的东西,它以下一个时间步不仅仅依赖于当前时间步的方式对系统进行建模。

【讨论】:

您好,如果您有时间,请告诉我您对这个问题的看法:***.com/questions/60895974/… :)【参考方案2】:

输出层之前的Dropout 可能有问题。我建议删除Dropout 层并评估性能,然后在模型在训练集上表现良好时重新引入正则化。

【讨论】:

非常感谢您的回答。 regularisation 是什么意思?是否可以向我展示如何在 python 中对我的模型进行正则化? 抱歉 - 正则化是一种在模型中加入惩罚项的方法,有助于避免过度拟合。澄清一下,dropout 是正则化的一种形式。我的意思是,一旦模型表现良好,您就可以重新引入 dropout。但一般来说,如果您想引入其他形式的正则化,例如 L2 或 L1,在 Keras 中相当容易 - 文档中有很好的描述:keras.io/regularizers。

以上是关于如何在 python 中处理具有许多特性的 LSTM?的主要内容,如果未能解决你的问题,请参考以下文章

如何将列表内列表的值分配给列表内另一个列表的值(python)?

python列表处理效率对比测试

如何使用 python 减少 kaggle Mushroom Classification 数据集中的特性数量?

在 python 的 for 循环中创建唯一名称列表

求python题目解答(初学阶段)

Python解析xml