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

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

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

Kerasは、TheanoやTensorFlow/CNTK対応のラッパーライブラリです。DeepLearningの数学的部分を短いコードでネットワークとして表現することが可能。DeepLearningの最新手法を迅速に試すことができます。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

2662閲覧

kerasを用いた多変量LSTMでmodel.fit()時にエラーが出ます

cognac_n

総合スコア1

Keras

Kerasは、TheanoやTensorFlow/CNTK対応のラッパーライブラリです。DeepLearningの数学的部分を短いコードでネットワークとして表現することが可能。DeepLearningの最新手法を迅速に試すことができます。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2020/06/01 10:50

編集2020/06/01 14:48

前提・実現したいこと

kerasを用いて4変量の時系列データをLSTMで4つに分類しようとしていますが、
レイヤーを積み上げた後、model.fitの段階でエラーが出てしまいます。
用いているデータは為替価格の時系列データで、
学習データXは[89711(サンプル数), 4(変量の数), 36(ルックバック数)]の次元で作成し、
ターゲットYは[89771(サンプル数), 4(分類したい数、one-hotベクトル化)]の次元で作成しました。

勉強不足による初歩的な失敗なのではないかと感じてはいるのですが、
自分の情報収集能力では解決の糸口がつかめておりません。
追加で必要な情報などありましたら是非コメントを宜しくお願いします。

発生している問題・エラーメッセージ

もともと出ていたエラー ValueError Traceback (most recent call last) <ipython-input-66-94ca9aad4ee1> in <module> ----> 1 history = model.fit(X_train, Y_train, batch_size = batch_size, epochs = epochs) ~略~ D:\Anaconda3\envs\tensorflow-gpu-2\lib\site-packages\tensorflow\python\keras\engine\training_utils.py in standardize_input_data(data, names, shapes, check_batch_axis, exception_prefix) 321 ': expected ' + names[i] + ' to have ' + 322 str(len(shape)) + ' dimensions, but got array ' --> 323 'with shape ' + str(data_shape)) 324 if not check_batch_axis: 325 data_shape = data_shape[1:] ValueError: Error when checking target: expected activation_5 to have 3 dimensions, but got array with shape (80739, 4)
input_shape=(None, X_train.shape[1], X_train.shape[2]) と、書き換えた場合のエラー --------------------------------------------------------------------------- InvalidArgumentError Traceback (most recent call last) D:\Anaconda3\envs\tensorflow-gpu-2\lib\site-packages\tensorflow\python\framework\ops.py in set_shape(self, shape) 557 dim_list, --> 558 unknown_shape) 559 except errors.InvalidArgumentError as e: InvalidArgumentError: Shapes must be equal rank, but are 3 and 2 During handling of the above exception, another exception occurred: ~略~ D:\Anaconda3\envs\tensorflow-gpu-2\lib\site-packages\tensorflow\python\framework\ops.py in set_shape(self, shape) 559 except errors.InvalidArgumentError as e: 560 # Convert to ValueError for backwards compatibility. --> 561 raise ValueError(str(e)) 562 563 @property ValueError: Shapes must be equal rank, but are 3 and 2

該当のソースコード

python3

1from tensorflow import keras 2from tensorflow.keras.models import Sequential 3from tensorflow.keras.layers import LSTM 4from tensorflow.keras.layers import Activation, Dense, Dropout, Flatten 5from tensorflow.keras.layers import Conv2D, MaxPooling2D 6from tensorflow.keras import backend as K 7from tensorflow.keras.initializers import he_normal 8from tensorflow.keras.optimizers import Adam 9 10# -略- 11 12#[X.shape, Y.shape] = [(89711, 4, 36), (89711, 4)] 13 14input_dim = num_sihyou*data_ago 15output_dim = 4 16num_hidden_units = 128 # 隠れ層のユニット数 17batch_size = 300 # ミニバッチサイズ 18epochs = 100 # 学習エポック数 19learning_rate = 0.001 # 学習率 20 21# モデルの作成 22model = Sequential() 23model.add(LSTM( 24 num_hidden_units, 25 input_shape=(X_train.shape[1], X_train.shape[2]), 26 return_sequences=True)) 27model.add(Dropout(0.2)) 28model.add(Dense(output_dim)) # 分類の数 29model.add(Activation("softmax")) 30model.compile(loss="categorical_crossentropy", optimizer="Adam") 31model.summary() 32history = model.fit(X_train, Y_train, batch_size = batch_size, epochs = epochs)

試したこと

多変量LSTMについての解説がwebでなかなか見つけ出せず、
試行錯誤すらできていません。

いただいた回答やコメントをもとに試したことは以下です
・jupyter notebookカーネルの再起動
->エラー内容に変化なし
・input_shape=(None, X_train.shape[1], X_train.shape[2]) と、書き換え
->モデルのレイヤー積み上げ段階でエラーが出るようになりました。
エラー内容を追記いたします。

補足情報(FW/ツールのバージョンなど)

Windows10
python = 3.6.10
tensorflow-gpu = 1.12.0
エディタ:jupyter notebook

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

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

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

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

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

meg_

2020/06/01 11:06

jupyter notebook使ってませんか? モデルがおかしくなっている気がするので、カーネル再起動してもう一回頭から実行してみてください。
cognac_n

2020/06/01 14:42

コメントありがとうございます。 ご指摘の通り、エディタとしてjupyter notebookを使っています。 カーネルの再起動を試してみましたが、エラーの内容は変化いたしませんでした。
guest

回答1

0

ベストアンサー

input_shape=(**None,**X_train.shape[1], X_train.shape[2])
ではないですか?3次元のデータを期待したのに2次元のデータ(shape (80739, 4))がやってきたぜ、
的なエラーだと思います。

↓Noneはバッチサイズらしいです(一度に学習させるサンプル数かな)
https://qiita.com/sasayabaku/items/b7872a3b8acc7d6261bf

ごめんなさい、Noneは無くてもよかったです。
↓太字の部分を変えました。変更しないと私の力では解決できませんでした。
なお、LSTMの解説を読むとXとYは同じパラメータで無いとダメな気がします。
(例:X→36日分の株価 Y→今日の株価)
分類したいならConv2Dとかの方が一般的なのかな、と思いましたがどうでしょうか?

↓は動きました。予測精度が悪い(予測値が0.6以上にならない)理由がよくわかりませんが、
学習は進んでいるようです。

python3

1from tensorflow import keras 2from tensorflow.keras.models import Sequential 3from tensorflow.keras.layers import LSTM 4from tensorflow.keras.layers import Activation, Dense, Dropout, Flatten 5from tensorflow.keras.layers import Conv2D, MaxPooling2D 6from tensorflow.keras import backend as K 7from tensorflow.keras.initializers import he_normal 8from tensorflow.keras.optimizers import Adam 9 10import matplotlib.pyplot as plt 11import numpy as np 12import math as mt 13 14image_list=[] 15temp = [] 16#[X.shape, Y.shape] = [(89711, 4, 36), (89711, 4)] 17 18for i in range(89711): 19 image=np.zeros(4).reshape(4,1) 20 for j in range(36): 21 itemp = np.array([mt.sin((j+i)*0.1)/2+0.5, mt.cos((j+i)*0.1)/2+0.5,mt.sin((j+i)*0.1+0.5)/2+0.5,mt.cos((j+i)*0.1+0.5)/2+0.5]) 22 image = np.append(image,itemp.reshape(4,1),axis=1) 23 24 image_list.append(image[::,1:37].reshape(4,36)) 25 temp.append([mt.sin((36+i)*0.1)/2+0.5, mt.cos((36+i)*0.1)/2+0.5,mt.sin((36+i)*0.1+0.5)/2+0.5,mt.cos((36+i)*0.1+0.5)/2+0.5]) 26 27X_train = np.array(image_list)#(89711, 4, 36)の入力。4変量はそれぞれサイン関数とか、36点分の連続データ 28Y_train = np.array(temp)#(89711, 4)のターゲット。 29 30print(X_train.shape) 31print(Y_train.shape) 32 33output_dim = 4 34num_hidden_units = 128 # 隠れ層のユニット数 35batch_size = 300 # ミニバッチサイズ 36epochs = 100 # 学習エポック数 37learning_rate = 0.001 # 学習率 38 39# モデルの作成 40 41num_hidden_units = 128 42output_dim = 4 43 44model = Sequential() 45model.add(LSTM( 46 num_hidden_units, 47 input_shape=(X_train.shape[1],X_train.shape[2]), 48 return_sequences=False))#←変更 49 50model.add(Dropout(0.2)) 51model.add(Dense(output_dim)) # 分類の数 52 53model.add(Activation("softmax")) 54 55model.compile(loss="mean_squared_error", optimizer="Adam")#←変更 56model.summary() 57 58 59model.fit(X_train, Y_train, 60 batch_size=batch_size, 61 epochs=100, 62 validation_split=0.1, 63 ) 64 65#ここから予測結果確認用 66lstm_data_y_predict = model.predict(X_train) 67 68plt.figure() 69plt.title('sin') 70plt.plot(Y_train[:, 0], lw=2) 71plt.plot(lstm_data_y_predict[:, 0], '--', lw=2) 72plt.figure() 73plt.title('cos') 74plt.plot(Y_train[:, 1], lw=2) 75plt.plot(lstm_data_y_predict[:, 1], '--', lw=2) 76 77plt.figure()

投稿2020/06/01 13:29

編集2020/06/02 15:08
tacanoviano

総合スコア46

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

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

cognac_n

2020/06/01 14:40

回答ありがとうございます。 input_shape=(None,X_train.shape[1], X_train.shape[2]) としたところ、レイヤーを積み上げる段階でエラーが出ています。 エラーの内容を質問内容に追記いたします。
cognac_n

2020/06/02 23:39

回答への追記ありがとうございます。 return_sequences=False と変更したところ、学習を進めることができました! return_sequences=Trueは回帰分析のような、XとYが同じパラメータの 分析に使われているようですね・・・。 大変助かりました。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問