web-dev-qa-db-ja.com

Keras:RNNの入力データをどのように準備すればよいですか?

KerasでRNNの入力データを準備するのに問題があります。

現在、私のトレーニングデータのディメンションは次のとおりです。(6752, 600, 13)

  • 6752:トレーニングデータの数
  • 600:タイムステップ数
  • 13:特徴ベクトルのサイズ(ベクトルはfloatにあります)

X_trainY_trainは両方ともこの次元にあります。

このデータをKerasのSimpleRNNに送る準備をしたいと思います。ステップ#0からステップ#599までのタイムステップを実行していると仮定します。 input_length = 5を使用したいとします。これは、最近の5つの入力を使用したいことを意味します。 (例:ステップ#10、#11、#12、#13、#14 @ステップ#14)。

X_trainをどのように再形成する必要がありますか?

(6752, 5, 600, 13)にする必要がありますか、それとも(6752, 600, 5, 13)にする必要がありますか?

そして、Y_trainはどのような形にすべきですか?

(6752, 600, 13)または(6752, 1, 600, 13)または(6752, 600, 1, 13)である必要がありますか?

15
totuta

最新の5つの入力のみを使用して出力を予測する場合は、トレーニングサンプルの600タイムステップ全体を提供する必要はありません。私の提案は、次の方法でトレーニングデータを渡すことです。

             t=0  t=1  t=2  t=3  t=4  t=5  ...  t=598  t=599
sample0      |---------------------|
sample0           |---------------------|
sample0                |-----------------
...
sample0                                         ----|
sample0                                         ----------|
sample1      |---------------------|
sample1           |---------------------|
sample1                |-----------------
....
....
sample6751                                      ----|
sample6751                                      ----------|

トレーニングシーケンスの総数は合計で

(600 - 4) * 6752 = 4024192    # (nb_timesteps - discarded_tailing_timesteps) * nb_samples

各トレーニングシーケンスは、5つのタイムステップで構成されています。すべてのシーケンスの各タイムステップで、特徴ベクトルの13個の要素すべてを渡します。その後、トレーニングデータの形状は(4024192、5、13)になります。

このループにより、データの形状が変わる可能性があります。

input = np.random.Rand(6752,600,13)
nb_timesteps = 5

flag = 0

for sample in range(input.shape[0]):
    tmp = np.array([input[sample,i:i+nb_timesteps,:] for i in range(input.shape[1] - nb_timesteps + 1)])

    if flag==0:
        new_input = tmp
        flag = 1

    else:
        new_input = np.concatenate((new_input,tmp))
16
Lorrit