用于多序列组的LSTM模型

时间:2018-12-17 08:09:04

标签: python tensorflow keras neural-network lstm

我有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 [第1组-第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%。

1 个答案:

答案 0 :(得分:2)

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

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

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

请注意,如果您的数据集非常小,则训练LSTM将会很困难,因为您的神经网络模型将不足以拟合数据,因此,您可能会观察到非常差的性能。通常适用于机器学习算法。


  

有没有特定的方法来训练这种多序列数据?请提供详细建议吗?

在这里,我不确定多个序列数据是什么意思?如果您不熟悉深度学习,建议您先学习它们,以了解为什么以及何时使用它们。

  

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

有几种方法。例如,如果那些特征的数量有限,则可以学习这些特征的矢量表示。我想您知道嵌入。您可以为这些功能训练n维嵌入。另一种选择是:在序列表示中添加一个值(就像您正在使用一个热向量一样)。假设gender是二进制属性,因此我将0/1值附加到输入矢量表示形式。