问题标签 [lstm-stateful]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
507 浏览

keras - 如何在 keras 中实现多状态 LSTM RNN

我有 1000 个不同的用户,数据集包含这些用户在过去 1 年的活动。总记录超过 300K。LSTM RNN 的输入具有与这些用户对应的特征向量。还包括用户,因为每个用户的行为可能因人而异。网络应该学习每个用户的行为,并且应该能够根据同一用户的过去信息预测下一个行为。如何在 LSTM RNN 中为每个用户维护单独的隐藏状态。

以下博客文章与我的问题类似:

https://towardsdatascience.com/multi-state-lstms-for-categorical-features-66cc974df1dc

更新

我的数据集如下所示:

数据集

我将我的数据集转换为 3D numpy 数组并将其重塑为(记录数、时间步长、n_features)。

问题是:

1)是否有必要对“用户”属性进行编码?

2)这个问题的正确批量大小是多少?是批次 = 1000(不同用户的数量)吗?

3)我需要在模型的每批输入中包含每个用户的数据吗?

或者

请建议这个问题的正确实现。

0 投票
2 回答
167 浏览

keras - Dense 期望 2d 但在 LSTM 中得到 3d

在我的模型中

当我建立我的模型时,

当我尝试适应它时会引发错误,

我需要预测所有 100 个功能的下一个时间戳。需要做哪些改变?

0 投票
1 回答
296 浏览

keras - 训练有和没有最终密集层的多对多有状态 LSTM

我正在尝试在 Keras 中训练一个包含 LSTM 用于回归目的的循环模型。我想在线使用该模型,据我了解,我需要训练一个有状态的 LSTM。由于模型必须输出一系列值,我希望它计算每个预期输出向量的损失。但是,我担心我的代码不能以这种方式工作,如果有人能帮助我了解我是否做得对或是否有更好的方法,我将不胜感激。

模型的输入是一个 128 维向量的序列。训练集中的每个序列都有不同的长度。每次,模型都应该输出一个包含 3 个元素的向量。

我正在尝试训练和比较两个模型:A)一个具有 128 个输入和 3 个输出的简单 LSTM;B) 一个具有 128 个输入和 100 个输出的简单 LSTM + 一个具有 3 个输出的密集层;

对于模型 A)我写了以下代码:

使用这段代码,模型 A) 似乎训练得很好,因为输出序列接近训练集上的真实序列。但是,我想知道损失是否真的是通过考虑所有 NTimes 输出向量来计算的。

对于模型 B),由于密集层,我找不到任何方法来获得整个输出序列。因此,我写道:

使用此代码,模型 B) 无法正常训练。在我看来,训练不会收敛,损失值会周期性地增加和减少,我也尝试仅将最后一个向量用作 Y,并且它们在整个训练序列 X 上调用拟合函数,但没有任何改进。

任何想法?谢谢!

0 投票
1 回答
203 浏览

python - TF 2.0 顺序 CNN 到 LSTM 中用于回归“负维度大小”错误

我正在尝试建立一个模型,根据当前市场状况预测某种商品的价格,我的数据形状类似于

所以我有 100 个有序的 X 数据样本,每个样本包含 10 个变量。我的模型如下所示

所以它是一个一维卷积、一个池化、一个重塑(所以它与 lstm 配合得很好),然后向下转换为一个预测

但是当我尝试运行它时,出现以下错误

输入形状为 [1,1,1,10], [1,2,10,4] 的“conv1d/conv1d”(操作:“Conv2D”)从 1 中减去 2 导致的负尺寸大小。

我已经为内核大小、池大小和 batch_input_shape 尝试了几个不同的值(必须批处理我的输入,因为我的实际数据分布在几个大文件中,所以我想一次读取一个并将它踢到训练模型),但似乎没有任何效果。

我究竟做错了什么?我如何跟踪/预测通过此模型的数据的形状?数据/变量应该是什么样的?

0 投票
1 回答
504 浏览

keras - LSTM 自动编码器在测试数据中产生较差的结果

我正在应用 LSTM 自动编码器进行异常检测。由于异常数据与正常数据相比非常少,因此仅使用正常实例进行训练。测试数据由异常和正常实例组成。在训练期间,模型损失似乎不错。然而,在测试数据中,模型产生的准确性较差。即异常点和正常点没有很好地分开。
我的代码片段如下:

请建议在模型中可以做些什么来提高准确性。

0 投票
1 回答
698 浏览

keras - 如何在 LSTM RNN 中传递分类信息和数值特征

我有一个数据集,其中包含 1000 个用户的活动数据。由于一个用户的活动与另一个用户不同,我希望用户属性也发送到 LSTM RNN 模型,以便模型可以更好地了解每个用户的行为。我的数据集片段如下:

https://i.stack.imgur.com/poL31.jpg

我尝试了分类信息的 one-hot 编码和二进制编码,但模型没有产生好的结果。但是将 LSTM RNN 模型应用于单个用户的数据(不包括用户变量)会产生很好的结果。

我的用于异常检测的 lstm 自动编码器模型片段如下:

现在我试过了,

n_features = 22; 不。特征 [ 1(带有 one-hot 编码的分类)+ 21(数字)]

encoding_dim = 16

hidden_​​dim = 8

如何使用此模型更好地处理分类属性,即用户变量?

0 投票
0 回答
54 浏览

tensorflow - 逐步训练 Keras LSTM(有状态)

使用 Keras + TF 1.14(非急切)时,是否可以逐步训练 LSTM 以提高内存效率?

来自 PyTorch,我可以逐步传递序列,进行反向传播并使用隐藏状态进行下一步,而无需及时停止梯度(只要有足够的内存)。

目前,LSTM 通过加载整个截断的时间序列进行训练,并使用 Keras TimeDistribute 进行处理。

假设网络在 LSTM 之后很深,PyTorch 版本应该需要更少的内存,因为我们只需要为 LSTM 之后的部分存储一个时间步的中间结果。(当使用相同的截断序列长度时)

Keras 如何实现类似的行为?

0 投票
1 回答
390 浏览

python - Keras 中共享 LSTM 层中的状态持久性

我正在尝试在 Keras 模型中使用具有状态的共享 LSTM 层,但似乎每次并行使用都会修改内部状态。这提出了两个问题:

  1. 在使用共享 LSTM 层训练模型并使用stateful=True时,并行使用是否也在训练期间更新相同的状态?
  2. 如果我的观察是有效的,有没有办法使用权重共享 LSTM,以便为每个并行使用独立存储状态?

下面的代码举例说明了三个序列共享 LSTM 的问题。将完整输入的预测与将预测输入分成两半并连续输入网络的结果进行比较。

可以观察到,a1与 的前半部分相同aFull,这意味着在第一次预测期间,LSTM 的使用确实与独立状态并行。即,z1不受并行调用创建z2z3. 但a2与后半部分不同aFull,因此并行使用的状态之间存在一定的交互作用。

我希望这两个部分的连接a1a2使用更长的输入序列调用预测的结果相同,但情况似乎并非如此。另一个问题是,当这种交互发生在预测中时,它是否也在训练期间发生。

更新:使用 Tensorflow 1.14 和 1.15 作为后端的 Keras 观察到上述行为。使用 tf2.0(使用调整后的导入)运行相同的代码会更改结果,因此a1不再与aFull. 这仍然可以通过设置stateful=False层实例化来完成。

这向我表明,我尝试使用具有共享参数的递归层,但自己的状态用于并行使用的方式,实际上是不可能的。

更新 2:似乎其他早先也错过了相同的功能:在 Keras 的 github 上已关闭、未回答的问题

作为比较,这里是 pytorch 中的一个涂鸦(我第一次尝试使用它)实现一个简单的网络,其中 N 个并行 LSTM 共享权重,但具有独立的状态。在这种情况下,状态显式存储在列表中并手动提供给 LSTM 单元。

结果:无论我们是一次性还是分段进行预测,输出都是相同的。

我尝试使用子类在 Keras 中复制它,但没有成功:

如果您现在问“为什么不使用 Torch 并闭嘴?”,答案是假设 Keras 已经构建了周围的实验框架,并且对其进行更改将是不可忽略的工作量。

0 投票
1 回答
154 浏览

machine-learning - 使用 RNN/LSTM 检测速度变化(给定当前 xy 位置)

给定连续数据的 x,y 坐标,我将如何使用 RNN/LSTM 来学习速度变化?(我必须使用循环层,因为这是一个更大的端到端模型的子问题,它也可以做其他事情)

训练数据示例:

到目前为止,我构建了有状态的 LSTM,并在每批一个项目上对其进行训练。之后,每当速度发生变化时,我都会重置 LSTM 的状态,因此我了解到一个段具有相同的速度(段可以有不同的长度)。

由于段的长度不同,我如何在生产中使用这种模型?

或者有没有更好的方法来训练这些数据的循环网络?也许是异常检测?(我想避免有固定的批量大小(例如 3 帧的窗口))

0 投票
1 回答
139 浏览

python - 有没有办法将时间权重传递给损失函数?

背景

目前,我正在使用 LSTM 执行回归。我正在使用具有相当大的时间步长的小批量(但比我拥有的时间步数要少得多)。

我正在尝试过渡到时间步长更少但启用状态的更大批次,以允许使用大量生成的训练数据。

但是,我目前正在使用基于 sqrt(timestep) 的正则化,(这是经过消融测试的,有助于提高收敛速度,它之所以有效,是因为问题的统计性质,预期误差会减少 sqrt(timestep) 的一个因子) . 这是通过使用tf.range在损失函数中生成适当大小的列表来执行的。当启用有状态时,这种方法将不正确,因为它会计算错误的时间步数(此批次中的时间步数,而不是到目前为止的整体)。

问题

有没有办法将整数或浮点数的偏移量或列表传递给损失函数?最好不要修改模型,但我认识到可能需要这种性质的 hack。

代码

简化模型:

损失函数

(计算损失函数片段的函数不应该是超级相关的。简单地说,它们也是损失函数。)