如何使用 keras TimeSeriesGenerator with shuffle=True?

问题描述 投票:0回答:1

keras TimeseriesGenerator with shuffle=True提供了一个随机标签,而不是与生成的时间序列相匹配的标签。我想知道如何使用TimeseriesGenerator,使其在标签与时间序列匹配的情况下生成洗牌批次。

例如

# imports
from tensorflow.keras.preprocessing.sequence import TimeseriesGenerator
import pandas as pd

# prepare data
df2 = pd.DataFrame([[1,1,1,1,1],
                   [2,2,2,2,2],
                   [3,3,3,3,3],
                   [4,4,4,4,4],
                   [5,5,5,5,5]])
df2.columns=['f1','f2','f3','l1','l2']
X2 = df2.iloc[:,0:3] # 
y2 = df2.iloc[:,3:]

x2:

    f1  f2  f3
0   1   1   1
1   2   2   2
2   3   3   3
3   4   4   4
4   5   5   5

y2:

    l1  l2
0   1   1
1   2   2
2   3   3
3   4   4
4   5   5

TimeseriesGenerator with shuffle=False:

data_gen2 = TimeseriesGenerator(X2.to_numpy(), y2.to_numpy(),
                                     length=2, sampling_rate=1,stride=1,
                                     batch_size=5,shuffle=False)
print('x values: data_gen2[0][0]:',data_gen2[0][0].shape)
print(data_gen2[0][0])
print('y values: data_gen2[0][1]:',data_gen2[0][1].shape)
print(data_gen2[0][1])

...产生的结果是:

x values: data_gen2[0][0]: (3, 2, 3)
[[[1 1 1]
  [2 2 2]]

 [[2 2 2]
  [3 3 3]]

 [[3 3 3]
  [4 4 4]]]
y values: data_gen2[0][1]: (3, 2)
[[3 3]
 [4 4]
 [5 5]]

这是完美的。然而,如果shuffle=True,我们得到。

x values: data_gen2[0][0]: (5, 2, 3)
[[[1 1 1]
  [2 2 2]]

 [[3 3 3]
  [4 4 4]]

 [[1 1 1]
  [2 2 2]]

 [[3 3 3]
  [4 4 4]]

 [[3 3 3]
  [4 4 4]]]
y values: data_gen2[0][1]: (5, 2)
[[5 5]
 [3 3]
 [5 5]
 [3 3]
 [3 3]]

虽然X2被正确地洗牌了(即不同的时间序列从不同的起点开始),但是y2与X2的时间序列不匹配.

我是不是误解了什么?

keras generator
1个回答
0
投票

好的。解决了。

调用TimeseriesGenerator的问题是..:

data_gen2[0][0]
data_gen2[0][1]

...的问题是,这将使生成器提供的数据更新两次。所以对gen2[0][1]的调用实际上是更新了gen2中的数据,并将目标返回到完全不同的一批样本中。

为了纠正,我们需要收集gen2[0]的全部数据,然后将元组拆分为x和y。

x3,y3 = data_gen2[0]

print(x3)
print(y3)

现在,目标与样本匹配。

[[[2 2 2]
  [3 3 3]]

 [[3 3 3]
  [4 4 4]]

 [[2 2 2]
  [3 3 3]]

 [[2 2 2]
  [3 3 3]]

 [[1 1 1]
  [2 2 2]]]
[[4 4]
 [5 5]
 [4 4]
 [4 4]
 [3 3]]
© www.soinside.com 2019 - 2024. All rights reserved.