【问题标题】:LSTM model for multiple sequence group多序列组的 LSTM 模型
【发布时间】:2018-12-17 08:09:03
【问题描述】:

我有 38 个数据集,每个数据集包含不同长度的序列(每个数据集包含不同数量的 A-G (7))。这些数据来自不同的学生来执行任务。所以每个序列主要反映了相同的过程但不同的策略。

Group1  Group2............ Group 38
 A        B                   F
 E        C                   A
 B        E                   G
 C        D                   G
 C        F                   F
 D        G                   G
 .        .                   .
 .        .                   .

我已将每一组转换为一个热向量并得到 38 个 nx8 矩阵(n 是序列的长度)。 基于这些数据,我想实现 LSTM/GRU 来预测另一组中的下一个词。训练这些数据的最佳方法是什么?目前,我正在使用这些代码来计算损失:[主要代码的一部分] 认为, 训练数据集:28[Group 1 - Group 28] 测试数据集:10[Rest]

 def calc_acc(series, skip=0):[#series will be training and testing data]
        loss = 0
        count = 0

        max_len = np.amax([len(x) for x in series])
        for k in range(min_context, max_len):
            feat = np.array([x[0:k] for x in series if len(x) > k])
            lab = np.array([x[k] for x in series if len(x) > k])
            pred = np.argmax(model.predict(feat), axis=1)
            actual = np.argmax(lab, axis=1)

            count += len(pred)
            loss += sum([x != y for x, y in zip(pred, actual)])

        if count == 0:
            return 1.0
        else:
            return 1. - loss / float(count)

我不确定它是否正确。我想以这样的方式训练模型,它首先进入第 1 组更新其权重,然后进入下一组[实际上我不明白如何训练这种情况]。我的模型如下:

def build_model(model, action_size, hidden_size=24, hidden_layers=3, dropout=True, activation='relu'):
  x = Input(shape=(None, action_size+1))#action size is 7(seven word)
  y = x
  y = LSTM(hidden_size if hidden_layers > 1 else action_size, 
  activation='tanh')(y)

  if dropout:
      y = Dropout(0.3)(y)
  if hidden_layers > 1:
      y = Dense(action_size, activation=None)(y)
  y = Activation('softmax')(y)

  return Model(inputs=x,outputs=y)

有了这些,我的准确率达到了 57%。

【问题讨论】:

    标签: python tensorflow keras neural-network lstm


    【解决方案1】:

    您的问题没有明确说明。如果我错了,请纠正我,我将您的数据描述如下。

    当您说您有 38 个数据集时,我猜您指的是 38 个数据点或示例。每个数据点都是一个序列,它们的长度可以变化。序列中的每个元素可以取 7 个可能的离散值中的 1 个 (A-G)。

    您提到,“我想实现 LSTM/GRU 来预测另一个组中的下一个单词”——这句话完全模棱两可。我怀疑,在您提供的示例中,对于 Group1,给定 A E B,您想要预测下一个元素 C。那是对的吗?你能清楚地提供一个输入和输出的例子吗?

    请注意,如果您的数据集非常小,训练 LSTM 会很困难,因为您的神经网络模型会欠拟合数据,因此您可能会发现性能非常差。这通常适用于机器学习算法。


    有没有什么具体的方法可以训练这种多序列数据?请给个详细的建议?

    这里,我不知道你说的多序列数据是什么意思?如果你不熟悉深度学习,我建议你先研究它们,了解为什么以及何时应该使用它们。

    如果我想添加其他与时间无关的特征 [血型/性别] 像这篇文章 [添加静态数据(不随时间变化)到 LSTM 中的序列数据,我该如何使用建议的模型?

    有几种方法。例如,如果这些特征的数量是有限的,您可以学习这些特征的向量表示。我猜你知道嵌入。您可以为这些特征训练 n 维嵌入。另一种选择可以是:在序列表示中添加一个值(就像您使用的是 one-hot-vector 一样)。比如说,gender 是一个二进制属性,所以我会在输入向量表示中附加一个 0/​​1 值。

    【讨论】:

    • 感谢您的回复。是的,您对数据的看法是绝对正确的。我有 38 个数据点。对于预测部分,你也是对的。假设在训练模型之后,我想预测第 1 组中序​​列的每个元素。当给定第一个单词 A 时,我想预测下一个单词。然后给定前两个单词,预测下一个单词..等等。 多序列数据*:我的意思是说,如果我只有一组,比如说 500 个序列,我会在这些组内划分训练和测试。但是对于目前的情况,我必须在数据点(组)中划分训练和测试数据。
    • 假设,我的训练集包含 37 个组,测试集包含 1 个组(LOOCV)。为了添加与时间无关的功能,我已经完成了您的建议。我将它们转换为二进制属性并直接添加到每个组的动态一个热向量中。我想尝试另一种方法。我找到了 [stackoverflow.com/questions/53363986/… 引用的帖子中描述的方法。但是我在实施建议的模型时遇到了问题
    猜你喜欢
    • 2022-10-24
    • 2022-07-28
    • 1970-01-01
    • 1970-01-01
    • 2017-02-10
    • 2019-02-23
    • 1970-01-01
    • 2020-07-11
    • 2021-10-06
    相关资源
    最近更新 更多