【问题标题】:poor performance keras lstm性能不佳的keras lstm
【发布时间】:2018-05-22 08:57:06
【问题描述】:

我想创建一个 lstm 模型来对信号进行分类。

假设我有 1000 个信号文件。每个文件都包含一个形状为 (500, 5) 的矩阵,这意味着在每个文件中,我有 5 个特征(列)和 500 行。

         0          1          2         3        4
0        5        5.3         2.3       4.2      2.2

...     ...       ...        ...         ...      ...

499     2500      1.2         7.4        6.7       8.6

对于每个文件,都有一个布尔值(True 或 False)输出。形状是 (1,)

我创建了一个数据库,data,形状为 (1000, 5, 500),目标向量的形状为 (1000, 1)。

然后我拆分数据(X_train、X_test、y_train、y_test)。

这样的矩阵给lstm模型可以吗?因为我的表现很差。据我所见,人们只提供 1D 或 2D 数据,然后他们重塑数据以将 3D 输入提供给 lstm 层。

带lstm的代码是这样的:

input_shape=(X_train.shape[1], X_train.shape[2]) #(5,500), i.e timesteps and features
model = Sequential()
model.add(LSTM(20, return_sequences=True))
model.add(LSTM(20))
model.add(Dense(1))
model.compile(loss='mae', optimizer='adam')

我更改了 LSTM 层中的单元数和层数,但分数基本相同(0.19)。在我的情况下,有这么差的分数是正常的吗?有没有更好的方法?

谢谢

【问题讨论】:

    标签: python-3.x performance keras lstm


    【解决方案1】:

    通过将数据转换为 (samples, 5, 500),您可以为 LSTM 提供 5 个时间步长和 500 个特征。从您的数据看来,您似乎希望处理所有 500 行和每列的 5 个特征来进行预测。 LSTM 输入是(样本、时间步长、特征)。因此,如果您的行表示进行 5 次测量的时间步长,那么您需要置换最后 2 个维度并在第一个 LSTM 层中设置 input_shape=(500, 5)

    此外,由于您的输出是布尔值,您可以通过在最终密集层中使用 activation='sigmoid' 并使用 loss='binary_crossentropy 进行二进制分类进行训练,从而获得更稳定的训练。

    【讨论】:

    • 我将“activation='sigmoid'”添加到 lstm 层,并用“binary_crossentropy”更改了“mae”损失。
    • 谢谢。我在 lstm 层中添加了“activation='sigmoid'”,并用“binary_crossentropy”更改了“mae”损失。我的分数提高到 0.52。但我不确定我是否理解你解释的第一部分。的每个数据行代表在给定时间采取的一系列措施。我不确定“您似乎希望处理所有 500 行和每列的 5 个特征以进行预测”的确切含义。
    • 嗯,你的问题并不清楚,那么是的,所以你在 5 个不同的时间进行了 500 次测量,应该是(样本,5,500)。
    猜你喜欢
    • 1970-01-01
    • 2020-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-03
    • 1970-01-01
    相关资源
    最近更新 更多