我有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%。
答案 0 :(得分:2)
您的问题未明确说明。如果我写错了,请纠正我,我将描述您的数据如下。
当您说有38个数据集时,我想您指的是38个数据点或示例。每个数据点都是一个序列,它们的长度可以变化。序列中的每个元素都可以采用7个可能的离散值(A-G)中的1个。
您提到过,“我想实现LSTM / GRU来预测另一个组中的下一个单词”-这句话完全模棱两可。在给定的A E B
的情况下,我怀疑在您为Group1提供的示例中,您要预测下一个元素C
。那是对的吗?您可以清楚地提供一个输入和输出示例吗?
请注意,如果您的数据集非常小,则训练LSTM将会很困难,因为您的神经网络模型将不足以拟合数据,因此,您可能会观察到非常差的性能。通常适用于机器学习算法。
有没有特定的方法来训练这种多序列数据?请提供详细建议吗?
在这里,我不确定多个序列数据是什么意思?如果您不熟悉深度学习,建议您先学习它们,以了解为什么以及何时使用它们。
如果我想添加其他与时间无关的功能(例如血型/性别),如这篇文章[在LSTM中为序列数据添加静态数据(不随时间变化),该如何使用建议的模型?
有几种方法。例如,如果那些特征的数量有限,则可以学习这些特征的矢量表示。我想您知道嵌入。您可以为这些功能训练n
维嵌入。另一种选择是:在序列表示中添加一个值(就像您正在使用一个热向量一样)。假设gender
是二进制属性,因此我将0/1值附加到输入矢量表示形式。