变长序列的训练和预测

Train and predict on variable length sequences(变长序列的训练和预测)
本文介绍了变长序列的训练和预测的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

散布在我的站点上的传感器(相同类型)以不定期的间隔手动向我的后端报告。在报告之间,传感器聚合事件并将其作为批报告。 以下数据集是批量收集的序列事件数据的集合。例如,传感器1报告了2次。在第一批2个事件和第二批3个事件上,而传感器2报告了1次3个事件。

我要将此数据用作我的列车数据X

ensors_id Batch_id 时间戳 Feature_1 Feature_n
1 1 2020-12-21T00:00:00+00:00 0.54 0.33
1 1 2020-12-21T01:00:00+00:00 0.23 0.14
1 2 2020-12-21T03:00:00+00:00 0.51 0.13
1 2 2020-12-21T04:00:00+00:00 0.23 0.24
1 2 2020-12-21T05:00:00+00:00 0.33 0.44
2 1 2020-12-21T00:00:00+00:00 0.54 0.33
2 1 2020-12-21T01:00:00+00:00 0.23 0.14
2 1 2020-12-21T03:00:00+00:00 0.51 0.13

我的目标y是根据传感器收集的所有事件计算得出的分数:
socre_sensor_1 = f([[batch1...],[batch2...]])

ensors_id 最终分数
1 0.8
2 0.6

我希望在每次收集批次时预测y,即对具有2个报告的传感器进行2个预测。


LSTM模型:
我从LSTM模型开始,因为我试图预测事件的时间序列。 我的第一个想法是选择一个固定大小的输入,并在收集的事件数小于输入大小时对输入进行零填充。然后屏蔽填充的值:

model.add(Masking(mask_value=0., input_shape=(num_samples, num_features)))

例如:

ensors_id Batch_id 时间戳 Feature_1 Feature_n
1 1 2020-12-21T00:00:00+00:00 0.54 0.33
1 1 2020-12-21T01:00:00+00:00 0.23 0.14

如果选定长度为5,则将生成以下输入:

[
 [0.54, 0.33],
 [0.23, 0.14],
 [0,0],
 [0,0],
 [0,0]
]

但是,在我的列车数据中,每个传感器报告的事件数差异很大,一个报告可以收集1000个事件,而另一个报告可以收集10个事件。因此,如果我选择平均大小(假设为200),一些输入将具有大量填充,而另一些将被截断并丢失数据。

我听说过ragged tensors,但我不确定它是否适合我的用例。如何处理这样的问题?

推荐答案

参差不齐的张量是出路:

粗糙张量是嵌套可变长度列表的TensorFlow等效项。它们使存储和处理形状不一致的数据变得容易

您可以通过多种方式创建粗糙张量,一种是从嵌套列表创建。

import tensorflow as tf
# your first sensor data from your example above
data = [[[0.54 , 0.33],[0.23 , 0.14]],[[0.51,0.13],[0.23,0.24],[0.33, 0.44]]]
X = tf.ragged.constant(data)

<tf.RaggedTensor [[[0.5400000214576721, 0.33000001311302185],   [0.23000000417232513, 0.14000000059604645]], [[0.5099999904632568, 0.12999999523162842], [0.23000000417232513, 0.23999999463558197], [0.33000001311302185, 0.4399999976158142]]]>

那么在您的模型中,您的第一层应该是ragged=True的输入和[None , number_of_features]的形状:

model = Sequential()
model.add(Input(shape=[None,2], dtype=tf.float32, ragged=True))
model.add(LSTM(16, activation='tanh'))
...

这篇关于变长序列的训练和预测的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!

本站部分内容来源互联网,如果有图片或者内容侵犯您的权益请联系我们删除!

相关文档推荐

Leetcode 234: Palindrome LinkedList(Leetcode 234:回文链接列表)
How do I read an Excel file directly from Dropbox#39;s API using pandas.read_excel()?(如何使用PANDAS.READ_EXCEL()直接从Dropbox的API读取Excel文件?)
subprocess.Popen tries to write to nonexistent pipe(子进程。打开尝试写入不存在的管道)
I want to realize Popen-code from Windows to Linux:(我想实现从Windows到Linux的POpen-code:)
Reading stdout from a subprocess in real time(实时读取子进程中的标准输出)
How to call type safely on a random file in Python?(如何在Python中安全地调用随机文件上的类型?)