我已经习惯了新的数据集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
感谢您的帮助!
答案 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
我的标签是最后一列,因此您可能需要稍作调整。