Tensorflow数据集API用于时间序列分类

时间:2018-07-03 20:18:28

标签: python tensorflow tensorflow-datasets

我已经习惯了新的数据集API,并尝试进行一些时间序列分类。我有一个格式为tf记录的数据集,其形状为: (time_steps x features)。另外,我每个时间步都有一个标签。 (time_steps x 1)

我想做的是重新格式化数据集,使其具有时间步骤的滚动窗口,如下所示: (n x windows_size x features)。以n为time_steps-window_size的量(如果滚动窗口的跨度为1)

标签应该是 (window_size x 1),表示我们在窗口中使用了最后一个time_step的标签。

我已经知道,我可以使用tf.sliding_window_batch()为功能创建滑动窗口。但是,标签以相同的方式成形,我不知道如何正确执行此操作:(n x window_size x 1

如何使用tensorflow数据集API做到这一点? https://www.tensorflow.org/programmers_guide/datasets

感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

我对TF 1.13的解决方案很慢。

    WIN_SIZE= 5000

dataset_input = tf.data.Dataset.from_tensor_slices(data1).window(size= WIN_SIZE,
                                                             shift= WIN_SIZE,
                                                             drop_remainder= False).flat_map(lambda x: 
                                                                                            x.batch(WIN_SIZE))

dataset_label = tf.data.Dataset.from_tensor_slices(data2).window(size= WIN_SIZE,
                                                             shift= WIN_SIZE,
                                                             drop_remainder= False).flat_map(lambda x: 
                                                                                            x.batch(WIN_SIZE)).map(lambda x:
                                                                                                                  x[-1])
dataset= tf.data.Dataset.zip((dataset_input, dataset_label))
dataset= dataset.repeat(1)
data_iter = dataset.make_one_shot_iterator() # create the iterator
next_sample= data_iter.get_next()

with tf.Session() as sess:
    i=0
    while True:
        try:
            r_= sess.run(next_sample)
            i+=1
            print(i)
            print(r_)
            print(r_[0].shape)
            print(r_[1].shape)

        except tf.errors.OutOfRangeError:
            print('end')
            break

我说“慢速解决方案”的原因也许是可以优化下面尚未完成的代码片段:

dataset_label = tf.data.Dataset.from_tensor_slices(data2).window(size= WIN_SIZE,
                                                         shift= WIN_SIZE,
                                                         drop_remainder= False).flat_map(lambda x: 
                                                                                        x.batch(WIN_SIZE)).map(lambda x:
                                                                                                              x[-1])

一个有前途的解决方案可能会找到一些“跳过”操作来跳过dataset_label中的无用值,而不是使用“窗口”操作(现在是)。

答案 1 :(得分:0)

我不知道该怎么做,但我想我也可以使用numpy来做。

我发现answer非常出色,并将其应用于我的案子。

之后,它只是像这样使用numpy:

train_df2 = window_nd(train_df, 50, steps=1, axis=0)
train_features = train_df2[:,:,:-1]
train_labels = train_df2[:,:,-1:].squeeze()[:,-1:]
train_labels.shape

我的标签是最后一列,因此您可能需要稍作调整。