本文介绍了变长序列的训练和预测的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
散布在我的站点上的传感器(相同类型)以不定期的间隔手动向我的后端报告。在报告之间,传感器聚合事件并将其作为批报告。 以下数据集是批量收集的序列事件数据的集合。例如,传感器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'))
...
这篇关于变长序列的训练和预测的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本站部分内容来源互联网,如果有图片或者内容侵犯您的权益请联系我们删除!