【问题标题】:How to structure and size Y-labels for multivariate sequence prediction using Keras LSTMs如何使用 Keras LSTM 为多变量序列预测构建和调整 Y 标签的大小
【发布时间】:2019-06-11 23:02:56
【问题描述】:

我正在研究一个序列预测问题,其中我的输入具有大小(numOfSamples、numOfTimeSteps、特征),其中每个样本是独立的,每个样本的时间步数是统一的(在使用 keras 将长度预填充为 0 之后.pad_sequences),我的特征数是 2。总结一下我的问题,我想知道如何构建我的 Y-label 数据集来为模型提供数据,并希望了解如何正确构建我的模型以输出我想要的是。

我的第一个特征是编码为唯一 int 的分类变量,第二个特征是数字。我希望能够预测下一个分类变量以及关联的 feature2 值,然后使用它反馈到网络中以预测序列,直到输出 EOS 类别。

这是我一直在参考的主要资源,旨在尝试了解如何创建与 keras.fit_generator 一起使用的生成器。 [1]

对于如何抓取“X”数据的小批量并没有混淆,但对于“Y”数据,我不确定我想要做什么的正确格式。由于我试图预测一个类别,我认为 t+1 时间步长的单热向量表示将是编码第一个特征的正确方法,我猜会导致 4?维数numpy矩阵??但是我对如何处理第二个数字特征有点迷茫。

现在,这让我想到了有关架构以及如何构建模型来做我想做的事情的问题。下面的架构有意义吗?我相信缺少一些我不理解的东西。

建议的架构(参数填写松散,尚未设置):

model = Sequential()
model.add(Masking(mask_value=0., input_shape=(timesteps, features)))
model.add(LSTM(hidden_size, return_sequences=True))
model.add(TimeDistributed(Dense(vocab_size)))
model.add(Activation('softmax'))
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['categorical_accuracy'])
model.fit_generator(...) #ill figure this out

因此,最后,softmax 激活可以预测 feature1 的下一个分类值。如何还输出 feature2 的值,以便我可以将两个特征的新预测作为下一个时间步长反馈回来?我是否需要某种并行架构,其中两个 LSTM 以某种方式组合在一起?

这是我第一次尝试使用神经网络或 Keras 做任何事情,我不会说我在 python 方面“很棒”,但我可以过得去。但是,我觉得我对基本的理论概念掌握得很好,但缺乏实践。

这个问题有点开放式,鼓励我挑选出我目前的策略。

再一次,总体目标是预测两个特征(分类、数字),以便从中间长度的序列中预测“完整序列”。
前任。我在这些填充的 max-len 序列上进行训练,但在生产中我想用它来预测当前看不见的时间步长的剩余部分,这将是可变长度的。

【问题讨论】:

  • 仍在此处寻求更多指导。谢谢!

标签: python keras deep-learning lstm recurrent-neural-network


【解决方案1】:

基本上,我正在寻找的每个答案都在本教程中进行了示例和解释。绝对是尝试了解如何建模多输出网络的绝佳资源。这篇文章对多输出 CNN 架构进行了冗长的演练。然而,我只花了大约三周的时间就偶然发现了。

https://www.pyimagesearch.com/2018/06/04/keras-multiple-outputs-and-multiple-losses/

【讨论】:

    【解决方案2】:

    好的,所以如果我理解正确(如果我错了,请纠正我)你想根据当前的特征预测下一个特征。

    当涉及到分类变量时,你的Dense层应该输出包含每个类概率的N-1个向量(当我们在这里时,如果你有机会,请使用pandas.get_dummies记住要指定参数drop_first=True,无论您使用什么进行单热编码,都应该采用类似的方法。

    除了每个样本的N-1个输出向量外,应该多输出一个数值。

    记得输出 logits(没有激活,不要像你现在那样在最后使用 softmax)。之后网络输出应该分成 N-1 部分(您的分类特征)并传递给能够处理 logits 的损失函数(例如,在 Tensorflow 中,它是 tf.nn.softmax_cross_entropy_with_logits_v2,它为您应用数值稳定的 softmax)。

    现在,您的网络输出的第 N 个元素应该传递给不同的损失,可能是 均方误差。

    根据这两个损失的损失值(你可以取两者的平均值来获得一个损失值),你通过网络进行反向传播,它可能会做得很好。

    很遗憾,我在 Keras 方面不够熟练,无法帮助您编写代码,但我认为您会自己弄清楚。虽然我们正在这样做,但我想建议 PyTorch 用于更多自定义神经网络(我认为您的符合此描述),尽管它在 Keras 中也绝对可行,您可以选择。

    其他“可能有帮助”的想法:您可以检查 Teacher Forcing 以了解您的任务类型。有关其背后的主题和理论的更多信息,请参阅出色的 Deep Learning Book 和代码示例(尽管再次在 PyTorch 中),可以在他们的文档 here 中找到。

    顺便说一句,有趣的想法,介意我是否将它与我目前的研究轨迹联系起来(当然要感谢你)?评论这个答案,如果可以的话,我们可以在聊天中说出来。

    【讨论】:

    • 感谢您的回复。这是有道理的,有两次损失。至于如何通过代码构建它,我不太清楚。 (我意识到你不是 Keras 人,所以一切都很好。只是指出任何其他潜在反应的困惑)我研究这些东西的时间很短,所以 Tensorflow 和 Keras 是我仅有的两个库真的玩过。我肯定需要研究 PyTorch。我现在来看看这个强迫老师的概念,因为我还没有听说过这个。谢谢!
    • 在代码方面你可能需要实现新的损失函数,互联网上有一些例子(例如here)。您可能需要使用 keras.backend,尽管这似乎很简单,您可能可以解决这个问题。
    • 那么以“BTW”开头的最后一部分呢?在这里联系我 szymon.maszke@protonmail.com,想私下听听你的意见(显然 StackOverflow 不允许用户之间的轻松交互......)。
    猜你喜欢
    • 2021-04-21
    • 2018-09-04
    • 2023-03-10
    • 2018-04-07
    • 2018-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多