質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

4318閲覧

多変量LSTMで各epochのlossが全てnanになってしまいます

multinguish

総合スコア6

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/01/04 11:15

TensorFlow 2.x での多変量LSTMとデータの前処理
こちらのサイトを参考に多変量LSTMにトライしています。

python

1import numpy as np 2import pandas as pd 3from matplotlib import pyplot as plt 4%matplotlib inline 5import seaborn as sns 6import time 7 8df = pd.read_csv('12.22min.csv') 9df['time'] = pd.to_datetime(df['time']) 10df.set_index('time', inplace=True) 11 12df

イメージ説明

python

1#ルックバック数 2look_back =25 3 4#データ数 5sample_size = len(df) - look_back 6 7#予測に用いる期間 8past_size = int(sample_size*0.8) 9future_size = sample_size - past_size +1 10 11#データセットを作る関数 12def make_dataset(raw_data, look_back=25): 13 _X = [] 14 _y = [] 15 16 for i in range(len(raw_data) - look_back): 17 _X.append(raw_data[i : i + look_back]) 18 _y.append(raw_data[i + look_back]) 19 _X = np.array(_X).reshape(len(_X), look_back, 1) 20 _y = np.array(_y).reshape(len(_y), 1) 21 22 return _X, _y 23 24from sklearn import preprocessing 25 26columns = list(df.columns) 27del columns[0] 28 29# 最小0、最大1に正規化 30Xs =[] 31for i in range(len(columns)): 32 Xs.append(preprocessing.minmax_scale(df[columns[i]])) 33Xs = np.array(Xs) 34 35# 各数値データを作成 36X_flow, y_flow = make_dataset(Xs[0], look_back=look_back) 37X_sBP, y_sBP = make_dataset(Xs[1], look_back=look_back) 38X_mBP, y_mBP = make_dataset(Xs[2], look_back=look_back) 39X_dBP, y_dBP = make_dataset(Xs[3], look_back=look_back) 40X_HR, y_HR = make_dataset(Xs[4], look_back=look_back)

ここでエラーが出てしまいました。
IndexError Traceback (most recent call last)
<ipython-input-115-5737a4ea2153> in <module>
4 X_mBP, y_mBP = make_dataset(Xs[2], look_back=look_back)
5 X_dBP, y_dBP = make_dataset(Xs[3], look_back=look_back)
----> 6 X_HR, y_HR = make_dataset(Xs[4], look_back=look_back)

IndexError: index 4 is out of bounds for axis 0 with size 4

下から11行目の「del columns[0]」で変に列がずれてしまったのだと思い削除したら次へ進めたのですが

python

1# 多変量LSTMに対応するための各データを結合 2X_con = np.concatenate([X_flow, X_sBP, X_mBP, X_dBP, X_HR], axis=2) 3 4X = X_con 5y = y_flow 6 7# データを過去分(訓練に用いる分)と未来分(未来の予測に用いる分)に分割 8X_past = X[:past_size] 9X_future = X[past_size-1:] 10y_past = y[:past_size] 11y_future = y[past_size-1:] 12 13# 訓練データを定義 14X_train = X_past 15y_train = y_past 16 17import tensorflow as tf 18from tensorflow.keras.layers import Input, LSTM, Dense, BatchNormalization 19from tensorflow.keras.models import Model 20from tensorflow.keras.optimizers import SGD, Adam 21 22# LSTMモデルを作成する関数 23def create_LSTM_model(): 24 input = Input(shape=(np.array(X_train).shape[1], np.array(X_train).shape[2])) 25 x = LSTM(64, return_sequences=True)(input) 26 x = BatchNormalization()(x) 27 x = LSTM(64)(x) 28 output = Dense(1, activation='relu')(x) 29 model = Model(input, output) 30 return model 31 32model = create_LSTM_model() 33model.summary() 34model.compile(optimizer=Adam(learning_rate=0.0001), loss='mean_squared_error')

イメージ説明

python

1history = model.fit(X_train, y_train, epochs=200, batch_size=64, verbose=1)

ここでepochにloss:nanしか出なくなり先に進めなくなってしまいました。

サイトの例文と相違する部分は
・時系列が分刻みである
・要素の列が一つ少ない
・予測対象の列が2列目に来ている
・各列の名称に沿ってデータ作成時に名称変更している

くらいと思うのですが、何が原因でうまくいかないのかわかりません。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

同様にやってみましたが、lossは順調に減って学習できました

同じデータが手元に無いので、
tokyo_weather.csv
から、列名を下記のように修正して、.csvを捏造しました
date → time (時:分:秒 も適当に付ける)
ave_temperature → flow
ave_humidity → HR (位置を一番右の列に移動する)
total_daylight_hours → sBP
total_precipitation → mBP
ave_wind_speed → dBP
ave_cloud_cover:削除

コードは、

python

1#df.set_index('time', inplace=True)

は無効に(コメント化)しました

python

1del columns[0]

は有効なままです
それ以外は、そのままです

上記と逆(df.set_index(...は有効、#del columns[0]は無効)の場合でも、lossは順調に減って学習できました

当方の環境は、下記の通りです
Windows 10
Python 3.7.9
tensorflow 1.15.3 (GPU無し)

おそらくコードは間違ってないと思うので、.csvのデータを調べることをお勧めします
欠損値が無いか、無効な文字が混在してないか、等

わりとありがちなのが、うまくデータが取れなかったときに特定の記号や数値(0とか999とか)が記入されていることです
数値が入っていて、それが正常な数値の範囲から大きく離れていると、正常な数値の変動が実質的に消えてしまいます

【追記】.csvの学習に使われている行範囲の数値を一つ削除したら、loss: nan になりました
数値以外のものを書いたら、コードの途中でエラーになったので、学習を開始する前に気付きますから、nanの原因にはなりませんね
データが抜けてるか、あるいはとんでもなく変な数値が書かれてるか、そのどちらかではないでしょうか

投稿2021/01/05 03:31

編集2021/01/05 04:21
jbpb0

総合スコア7653

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

multinguish

2021/01/07 03:03 編集

ありがとうございます。 ご指摘の通り欠損値が0で埋められていたためと考えられました。 移動平均より補完して試したところ先に進むことができました。 しかし最後の ---python plt.figure(figsize=(18, 9)) plt.plot(df['date'][look_back:], y, color="b", label="true_cloud_cover") plt.plot(df['date'][look_back:look_back + past_size], predictions, color="r", linestyle="dashed", label="prediction") plt.plot(df['date'][-future_size:], future_predictions, color="g", linestyle="dashed", label="future_predisction") plt.legend() plt.show() --- のところでエラーが出てしまいました。 --------------------------------------------------------------------------- KeyError Traceback (most recent call last) ~/opt/anaconda3/lib/python3.8/site-packages/pandas/core/indexes/base.py in get_loc(self, key, method, tolerance) 2888 try: -> 2889 return self._engine.get_loc(casted_key) 2890 except KeyError as err: pandas/_libs/index.pyx in pandas._libs.index.IndexEngine.get_loc() pandas/_libs/index.pyx in pandas._libs.index.IndexEngine.get_loc() pandas/_libs/hashtable_class_helper.pxi in pandas._libs.hashtable.PyObjectHashTable.get_item() pandas/_libs/hashtable_class_helper.pxi in pandas._libs.hashtable.PyObjectHashTable.get_item() KeyError: 'time' The above exception was the direct cause of the following exception: KeyError Traceback (most recent call last) <ipython-input-186-e491811181c6> in <module> 1 plt.figure(figsize=(18, 9)) ----> 2 plt.plot(df['time'][look_back:], y, color="b", label="flow") 3 plt.plot(df['time'][look_back:look_back + past_size], predictions, color="r", linestyle="dashed", label="prediction") 4 plt.plot(df['time'][-future_size:], future_predictions, color="g", linestyle="dashed", label="future_predisction") 5 plt.legend() ~/opt/anaconda3/lib/python3.8/site-packages/pandas/core/frame.py in __getitem__(self, key) 2897 if self.columns.nlevels > 1: 2898 return self._getitem_multilevel(key) -> 2899 indexer = self.columns.get_loc(key) 2900 if is_integer(indexer): 2901 indexer = [indexer] ~/opt/anaconda3/lib/python3.8/site-packages/pandas/core/indexes/base.py in get_loc(self, key, method, tolerance) 2889 return self._engine.get_loc(casted_key) 2890 except KeyError as err: -> 2891 raise KeyError(key) from err 2892 2893 if tolerance is not None: KeyError: 'time' ---------------------------------------------------------------------- これは参考サイトにしたがってcsvの列名とpython内の「time」を全て「date」に直してもKeyError: 'date'となってしまいました。
jbpb0

2021/01/07 03:19

#df.set_index(...は無効、del columns[0]は有効、にしてください
multinguish

2021/01/09 02:27

実行することができました。 ご丁寧に対応いただき誠にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問