前提・実現したいこと
Python初心者です。
Python3(TensorFlow,Keras)で、予測プログラムを作成しています。
「PythonとKerasによるディープラーニング」(マイナビ出版)
Francoius Chollet[著] 株式会社クイープ[訳] 巣籠悠輔[監訳]
のサンプルコードを元に作っています。
180個×6種類の説明変数から1つの目的変数を出力したいのですが、下の出力のように、説明変数の入力範囲が大きく被ってしまっています。
env_dataは説明変数が入っているデータ(54000,6)で、ea_dataは目的変数が入っているデータ(300,1)です。
説明変数180行に対して目的変数が1行となっているため、行数が異なっています。
env_dataはインデックス027000を訓練データ、2700154000を検証データとして使っています。
訓練データと検証データの分け方を1:1としてしまいましたが、後ほど7:3や8:2などに修正する予定です。
読み込んでいる範囲
range(27001, 27181, 6) range(27002, 27182, 6) range(27003, 27183, 6) range(27004, 27184, 6) range(27005, 27185, 6) range(27006, 27186, 6) range(27007, 27187, 6) range(27008, 27188, 6) range(27009, 27189, 6) range(27010, 27190, 6) range(27011, 27191, 6) range(27012, 27192, 6) range(27013, 27193, 6) ... range(53636, 53816, 6) range(53637, 53817, 6) range(53638, 53818, 6) range(53639, 53819, 6) range(53640, 53820, 6)
該当のソースコード(一部)
Python3
1def generator(env_data, ea_data, lookback, min_index, max_index, 2 shuffle=False, batch_size=60, step=6): 3 if max_index is None: 4 max_index = len(env_data) - 1 5 i = min_index + lookback 6 while 1: 7 if shuffle: 8 rows = np.random.randint( 9 min_index + lookback, max_index, size=batch_size) 10 else: 11 if i + batch_size >= max_index: 12 i = min_index + lookback 13 rows = np.arange(i, min(i + batch_size, max_index)) 14 i += len(rows) 15 16 samples = np.zeros((len(rows), 17 lookback // step, 18 env_data.shape[-1])) 19 targets = np.zeros((len(rows),)) 20 for j, row in enumerate(rows): 21 indices = range(rows[j] - lookback, rows[j], step) 22 print(indices) 23 samples[j] = env_data[indices] 24 targets[j] = ea_data[j] 25 yield samples, targets 26 27lookback = 180 28step = 6 29batch_size = 60 30 31train_gen = generator(env_data, 32 ea_data, 33 lookback=lookback, 34 min_index=0, 35 max_index=27000, 36 step=step, 37 batch_size=batch_size) 38val_gen = generator(env_data, 39 ea_data, 40 lookback=lookback, 41 min_index=27001, 42 max_index=54000, 43 step=step, 44 batch_size=batch_size) 45 46
試したこと
①forループに新たにk = j * 180を追加し、説明変数の読み込みに使用
forループを以下のように変更しました。
Python3
1for j, row in enumerate(rows): 2 k = j * 180 3 indices = range(rows[k] - lookback, rows[k], step) 4 print(indices) 5 samples[j] = env_data[indices] 6 targets[j] = ea_data[j] 7 yield samples, targets
すると、以下のような出力、エラーが出ました。
range(27001, 27181, 6) --------------------------------------------------------------------------- IndexError Traceback (most recent call last) <ipython-input-19-043d54e5430b> in <module> ----> 1 evaluate_naive_method() <ipython-input-18-1d90892e791a> in evaluate_naive_method() 4 batch_maes = [] 5 for step in range(val_steps): ----> 6 samples, targets = next(val_gen) 7 preds = samples[:, -1, 1] 8 #全バッチのindex(-1,1)部分を抽出。つまりベクトル型となりtargetsと同型 <ipython-input-16-201bb8db6b0a> in generator(env_data, ea_data, lookback, min_index, max_index, shuffle, batch_size, step) 20 for j, row in enumerate(rows): 21 k = j * 180 ---> 22 indices = range(rows[k] - lookback, rows[k], step) 23 print(indices) 24 samples[j] = env_data[indices] IndexError: index 180 is out of bounds for axis 0 with size 60
②forループの中の変数indicesでrowsを使うのをやめてみた
rowsがよくわからないのでやめてみました…。
Python3
1 for j, row in enumerate(rows): 2 k = j * 180 3 indices = range(min_index + k, min_index + k + lookback, step) 4 print(indices) 5 samples[j] = env_data[indices] 6 targets[j] = ea_data[j] 7 yield samples, targets
すると、以下のような出力、エラーが出ました。
range(27001, 27181, 6) range(27181, 27361, 6) range(27361, 27541, 6) ... range(53461, 53641, 6) range(53641, 53821, 6) range(53821, 54001, 6) range(54001, 54181, 6) --------------------------------------------------------------------------- IndexError Traceback (most recent call last) <ipython-input-23-043d54e5430b> in <module> ----> 1 evaluate_naive_method() <ipython-input-22-1d90892e791a> in evaluate_naive_method() 4 batch_maes = [] 5 for step in range(val_steps): ----> 6 samples, targets = next(val_gen) 7 preds = samples[:, -1, 1] 8 #全バッチのindex(-1,1)部分を抽出。つまりベクトル型となりtargetsと同型 <ipython-input-20-b4ae8a01afe2> in generator(env_data, ea_data, lookback, min_index, max_index, shuffle, batch_size, step) 22 indices = range(min_index + k, min_index + k + lookback, step) 23 print(indices) ---> 24 samples[j] = env_data[indices] 25 targets[j] = ea_data[j] 26 yield samples, targets IndexError: index 54001 is out of bounds for axis 0 with size 54000
env_dataの形は(54000,6)なので、意味はわかりますが、無限に続いてしまっているようです。
③ ②のコードにwhileを追加
②で起こった問題を解決するために、以下のようにwhileを追加しました。
Python3
1 for j, row in enumerate(rows): 2 k = j * 180 3 l = min_index + k 4 if l + lookback <= max_index + 1: 5 indices = range(l, l +lookback, step) 6 print(indices) 7 samples[j] = env_data[indices] 8 targets[j] = ea_data[j] 9 yield samples, targets
すると、以下のような出力が出ました。
range(27001, 27181, 6) range(27181, 27361, 6) range(27361, 27541, 6) range(27541, 27721, 6) range(27721, 27901, 6) ... range(37261, 37441, 6) range(37441, 37621, 6) range(37621, 37801, 6) range(27001, 27181, 6) range(27181, 27361, 6) ... range(37621, 37801, 6) range(27001, 27181, 6) range(27181, 27361, 6) ... ... range(37261, 37441, 6) range(37441, 37621, 6) range(37621, 37801, 6)
このように、range(37621, 37801, 6)まで読み込んだ後に再びrange(27001, 27181, 6)から読み込むというループになっていました。上記の出力結果では省略しましたが、数え切れないくらい繰り返していました。初めに回したときは、同じように繰り返していましたが、終わりがrange(53821, 54001, 6)となっていました。しかし、再び回すと終わりがrange(37621, 37801, 6)となってしまい、それ以降何度回し直しても終わりがrange(37621, 37801, 6)となります。コードは変えていません。
また、初めのコードでもそうでしたが、出力されるrangeのスタートが検証データのスタートのインデックスとなっているのですが、これで正しいのでしょうか…。
補足情報(FW/ツールのバージョンなど)
Python3.7.3
回答1件
あなたの回答
tips
プレビュー