ichou1のブログ

主に音声認識、時々、データ分析のことを書く

Kerasメモ(時系列データの学習サンプル生成)

https://www.oreilly.co.jp/books/images/picture978-4-87311-857-4.gif
「RとKerasによるディープラーニング」

イエナ天候データセットから学習用の入力データを生成する部分のメモ。

このデータセットは、10分ごとに、気温や気圧といった14種類の数値を記録したものになる。
(1時間で6サンプル、1日で144サンプル集まる)

1時間おき(step=6)に、10日分(lookback=1440)の学習データを生成する場合、以下のようにgeneratorを指定する。
ここで、1時間おきにとしているのは、ある時点(t)の数値と、10分後(t+1)の数値が、ほぼ似通っていることによる。
10日分で240個(=1440 / 6)の時系列データが得られる。

train_gen <- generator(
  data,
  lookback = 1440,  # observations will go back 10 days
  delay = 144,      # targets will be 24 hours in the future
  min_index = 1,
  max_index = 10000,
  shuffle = FALSE,
  step = 6,         # observations will be sampled at one data point per hour
  batch_size = 128
)
コード全体

deep-learning-with-r-notebooks/6.3-advanced-usage-of-recurrent-neural-networks.Rmd at master · jjallaire/deep-learning-with-r-notebooks · GitHub

元データのままでは確認しにくいので、検証用のデータを作成する。
データ数(行数)は1万、1列目は1から、2列目は10001から1刻みで増加。

data <- data.matrix(cbind(seq(1, 10000, 1), seq(10001, 20000, 1)))
> dim(data)
[1] 10000     2

> data
          [,1]  [,2]
    [1,]     1 10001
    [2,]     2 10002
    [3,]     3 10003
    [4,]     4 10004
    [5,]     5 10005
...
 [9996,]  9996 19996
 [9997,]  9997 19997
 [9998,]  9998 19998
 [9999,]  9999 19999
[10000,] 10000 20000

1回目のgenerator実行により得られた出力。

samples(入力サンプル)

テンソルの形状は、(batch_size, timesteps, input_features)=(128, 240, 2)

, , 1
       [,1] [,2] [,3] ... [,238] [,239] [,240]
  [1,]    1    7   13 ...   1427   1433   1440
  [2,]    2    8   14 ...   1428   1434   1441
  [3,]    3    9   15 ...   1429   1435   1442
 ...                  ...
[126,]  126  132  138 ...   1552   1558   1565
[127,]  127  133  139 ...   1553   1559   1566
[128,]  128  134  140 ...   1554   1560   1567

, , 2
        [,1]  [,2]  [,3] ... [,238] [,239] [,240]
  [1,] 10001 10007 10013 ...  11427  11433  11440
  [2,] 10002 10008 10014 ...  11428  11434  11441
  [3,] 10003 10009 10015 ...  11429  11435  11442
 ...                     ...
[126,] 10126 10132 10138 ...  11552  11558  11565
[127,] 10127 10133 10139 ...  11553  11559  11566
[128,] 10128 10134 10140 ...  11554  11560  11567

239列目と240列目の差分が「6」(=step)ではなく、「7」になっているのは、seq関数出力の小数点以下を切り捨てていることによる。

> seq(1, 1440, length.out=240)
  [1]    1.000000    7.020921   13.041841   19.062762   25.083682   31.104603
 ...
[235] 1409.895397 1415.916318 1421.937238 1427.958159 1433.979079 1440.000000
targets(ラベル)

テンソルの形状は、(batch_size, output_features)=(128, 1)
144サンプル後(=1日後)の2列目の値が該当する。

  [1] 11585
  [2] 11586
  [3] 11587
 ...  
[126] 11710
[127] 11711
[128] 11712

ここでは、1日と10分(=144+1)後の値になっているので、以下のコードを

targets[[j]] <- data[rows[[j]] + delay, 2]

下記のとおり修正すればよい。

targets[[j]] <- data[rows[[j]] + delay - 1, 2]


"shuffle = TRUE"にしてgeneratorを実行した場合の出力は以下のとおり。

samples(入力サンプル)
, , 1
       [,1] [,2] [,3] ... [,238] [,239] [,240]
  [1,] 2404 2410 2416 ...   3830   3836   3843
  [2,] 5336 5342 5348 ...   6762   6768   6775
  [3,] 2132 2138 2144 ...   3558   3564   3571
 ...                  ... 
[126,] 3071 3077 3083 ...   4497   4503   4510
[127,] 1617 1623 1629 ...   3043   3049   3056
[128,] 1432 1438 1444 ...   2858   2864   2871

, , 2
        [,1]  [,2]  [,3] ... [,238] [,239] [,240]
  [1,] 12404 12410 12416 ...  13830  13836  13843
  [2,] 15336 15342 15348 ...  16762  16768  16775
  [3,] 12132 12138 12144 ...  13558  13564  13571
 ...                     ... 
[126,] 13071 13077 13083 ...  14497  14503  14510 
[127,] 11617 11623 11629 ...  13043  13049  13056
[128,] 11432 11438 11444 ...  12858  12864  12871
targets(ラベル)
  [1] 13988
  [2] 16920
  [3] 13716
...
[126] 14655
[127] 13201
[128] 13016


開始位置となるindexをシャッフルしているのであり、時系列データは保たれる。

shuffle = TRUE
rows <- sample(c((min_index+lookback):max_index), size = batch_size)
shuffle = FALSE
rows <- c(i:min(i+batch_size-1, max_index))