【问题标题】:Tensorflow - How to handle sequence input data (Sequence Data Input Layer)Tensorflow - 如何处理序列输入数据(序列数据输入层)
【发布时间】:2023-04-06 17:34:01
【问题描述】:

我有一堆时间序列。 数据格式如下:

input_data = {
    'category_a': tf.Variable([[3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
                                3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5,
                                6, 6, 8, 8, 8, 8, 9, 9, 9],
                               [5, 5, 5, 5, 6, 6, 6, 6, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
                                0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
                                0, 0, 0, 0, 0, 0, 0, 0, 0]], dtype=tf.int32),
    'numeric_a': tf.Variable([[0.23378488, 0.20349434, 0.20352034, 0.20349434, 0.23378488,
                               0.20352034, 0.20349434, 0.20349434, 0.23378488, 0.20352034,
                               0.20349434, 0.20349434, 0.23378488, 0.20352034, 0.20349434,
                               0.20349434, 0.23378488, 0.20352034, 0.20349434, 0.20349434,
                               0.23378488, 0.20352034, 0.20349434, 0.20349434, 0.23378488,
                               0.20349434, 0.20352034, 0.20349434, 0.20719424, 0.2086331 ,
                               0.23439065, 0.20352887, 0.23439065, 0.20352887, 0.2086331 ,
                               0.20719424, 0.23439065, 0.20352887, 0.2086331 , 0.20719424,
                               0.20352066, 0.20349434, 0.20349434, 0.20352066, 0.23267019,
                               0.2035374 , 0.24012332, 0.21045385, 0.24012332, 0.21045385,
                               0.20349434, 0.20349434, 0.20349434],
                              [0.20351858, 0.20349434, 0.20349434, 0.20351858, 0.23157308,
                               0.23044993, 0.2035374 , 0.20349434, 0.20349434, 0.20349434,
                               0.20349434, 0.        , 0.        , 0.        , 0.        ,
                               0.        , 0.        , 0.        , 0.        , 0.        ,
                               0.        , 0.        , 0.        , 0.        , 0.        ,
                               0.        , 0.        , 0.        , 0.        , 0.        ,
                               0.        , 0.        , 0.        , 0.        , 0.        ,
                               0.        , 0.        , 0.        , 0.        , 0.        ,
                               0.        , 0.        , 0.        , 0.        , 0.        ,
                               0.        , 0.        , 0.        , 0.        , 0.        ,
                               0.        , 0.        , 0.        ]], dtype=tf.float32)
}

“类别 a”代表一个分类变量,我想对其进行一次热编码(与 feature_columns 指示列一样)。 每个特征拆分张量。第一个维度表示批量大小 (2)。第二个维度是具有序列长度 (53) 的时间步长。所有序列都被填充到每个批次大小的最大序列长度。每个批次的最大序列长度可能不同。

因此,张量中的值是该特定时间序列的给定时间步长的特征值。

如何将这些数据输入到 lstm 之类的模型中?

我查看了 tensorflow feature_columns,它处理类似格式的数据。 它们对分类数据的编码非常有帮助(例如,indicator_column 和 categorical_column)

我查看了keras.experimental.SequenceFeatures,它似乎提供了所需的功能,但我无法让它工作,而且我很难找到它的工作代码 sn-ps。

我对实现是否在 Keras 中无所谓。

【问题讨论】:

    标签: python tensorflow tensorflow-datasets


    【解决方案1】:

    Keras LSTM 可以处理您的输入,而无需将其存储在 tensorflow 变量中。但是,对于您的情况,您需要重新格式化数据,以便批量大小是第一个维度,第二个是时间步长,第三个是特征。

    model = Sequential()
    model.add(LSTM(number_of_neurons, 
                   activation=activation_function,
                   return_sequences=False, 
                   input_shape=(number_of_timesteps, number_of_features)))
    

    input_shape 选项用于定义数据的形状。

    在模型结束时,您可以在 training_datatraining_target 中分别提供数据和目标

    model.fit(training_data, 
              training_target,
              batch_size=batch, 
              epochs=epoch,
              validation_data=(test_data, test_target))
    

    在你的情况下是:

    [[[3.0, 0.23378488], [3.0, 0.20349434], ...]
      [5.0, 0.20351858], [5.0, 0.20349434], ...]
       ...]]]
    

    keras 文档中的 Stacked LSTM for sequence classification 示例是一个很好的起点: https://keras.io/getting-started/sequential-model-guide/#examples

    【讨论】:

    • 非常感谢您的帮助,但第一个功能是分类变量。我编辑了这个缺失的澄清问题。
    • 在这种情况下,您始终可以对变量进行一次热编码,并且每个类别都有一个特征。只需将 1 存储在该时间步的类别中,然后将 0 存储在其余部分中
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-04
    • 1970-01-01
    • 1970-01-01
    • 2017-11-19
    • 1970-01-01
    • 2018-03-16
    相关资源
    最近更新 更多