Tensorflow-如何处理序列输入数据(序列数据输入层)

时间:2019-11-22 11:06:57

标签: python tensorflow tensorflow-datasets

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

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,它似乎提供了必需的功能,但我无法使其正常工作,因此很难找到有效的代码段。

我对实施是否在Keras中无关紧要。

1 个答案:

答案 0 :(得分: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文档中的用于序列分类的堆叠LSTM 示例是一个很好的起点: https://keras.io/getting-started/sequential-model-guide/#examples