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

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

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

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

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Python

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

Q&A

0回答

1380閲覧

one-hot化した学習データでエラーが発生する(kerasのLSTMを利用)

imonikai

総合スコア13

Keras

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

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Python

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

0グッド

0クリップ

投稿2021/04/30 05:37

編集2021/05/06 23:45

google colaboratory環境において
kerasを用いてのLSTMを試行錯誤しながら作成しております

まずはこちらのサイト
https://machinelearningmastery.com/how-to-develop-lstm-models-for-time-series-forecasting/

1.Univariate LSTM Modelsの
1-2.Vanilla LSTMを利用し
流れを確認するところから始めました。

色々なサイトを調べているうちに
学習データをone-hot形式にし、損失関数をcategorical_crossentropyにすると
若干予測が良い的なことが記載されているページを何個かみました。
なのでこのVanilla LSTMのサンプルソースをone-hot化して、実行するように変更してみたのですが
エラーが発生してしまい、困っております。

質問内容は
(1)
エラー発生箇所が、学習後のpredictする部分でinputデータの形式がおかしい的なことが表示されておりどのように修正すれば解決するのか
(そもそも学習用データや正解ラベルの形式がおかしい場合はどのような形式にすればよいのか)
※エラー内容はページ最下部に記載しております

(2)
LSTMは、学習用データをone-hot化または、正規化のどちらにしたほうが正答率が高いのか

(3)
今回は簡単に10~200までの数字を3つづつに区切って次のデータを予測するなんてことをしておりますが、天気データ(気温、湿度、風速等)や株価データ(終値、出来高数等)など、複数のデータを学習させて次の予測を出すやり方はどのようにすればよいのか
(多変量というものでしょうか)

おわかりになる方がいらっしゃましたらアドバイスを頂ければと思い投稿させていただきました。
よろしくお願いします

以下、作成したソース

python

1# univariate lstm example 2from numpy import array 3from numpy import argmax 4 5from keras.models import Sequential 6from keras.layers import LSTM 7from keras.layers import Dense 8 9 10# one hot encode 11def one_hot_encode(sequence, n_unique=1000): 12 encoding = list() 13 for value in sequence: 14 vector = [0 for _ in range(n_unique)] 15 vector[value] = 1 16 encoding.append(vector) 17 return array(encoding) 18 19 20# one hot encode sequence 21def one_hot_encode2(sequence, n_unique=1000): 22 encoding = list() 23 24 #for value in sequence: 25 vector = [0 for _ in range(n_unique)] 26 vector[sequence] = 1 27 encoding.append(vector) 28 a = array(encoding) 29 a = a.reshape(1000) 30 31 return a 32 #return array(encoding) 33 34 35# decode a one hot encoded string 36def one_hot_decode(encoded_seq): 37 return [argmax(vector) for vector in encoded_seq] 38 39 40# split a univariate sequence into samples 41def split_sequence(sequence, n_steps): 42 X, y = list(), list() 43 for i in range(len(sequence)): 44 # find the end of this pattern 45 end_ix = i + n_steps 46 # check if we are beyond the sequence 47 if end_ix > len(sequence)-1: 48 break 49 # gather input and output parts of the pattern 50 seq_x, seq_y = sequence[i:end_ix], sequence[end_ix] 51 X.append(one_hot_encode(seq_x)) 52 y.append(one_hot_encode2(seq_y)) 53 return array(X), array(y) 54 55 56# define input sequence 57raw_seq = [10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120, 130, 140, 150, 160,170, 180,190,200,210] 58# choose a number of time steps 59n_steps = 3 60 61 62# split into samples 63X, y = split_sequence(raw_seq, n_steps) 64 65# reshape from [samples, timesteps] into [samples, timesteps, features] 66n_features = 1000 67X = X.reshape((X.shape[0], X.shape[1], n_features)) ########## (1) 68 69print(y) ########## (2) 70y = y.reshape(len(y),1000) ########## (3) 71 72 73# define model 74model = Sequential() 75model.add(LSTM(50, activation='relu', batch_input_shape=(X.shape[0], X.shape[1], n_features,),dropout=0.15)) 76model.add(Dense(1000, activation="softmax")) 77model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy']) 78 79 80# fit model 81history = model.fit(X, y, epochs=50, batch_size=2, verbose=1) 82 83 84# demonstrate prediction 85x_input = one_hot_encode(array([190,200,210])) 86 87x_input = x_input.reshape((1, n_steps, n_features)) ########## (4) 88 89 90yhat = model.predict(x_input, verbose=0) 91

ソース内の各箇所に(1)~(4)までの印をつけました
そこで表示されている結果を記載します

コメント(1)の中身

# データ内容 [[[0 0 0 ... 0 0 0] [0 0 0 ... 0 0 0] [0 0 0 ... 0 0 0]] [[0 0 0 ... 0 0 0] [0 0 0 ... 0 0 0] [0 0 0 ... 0 0 0]] [[0 0 0 ... 0 0 0] [0 0 0 ... 0 0 0] [0 0 0 ... 0 0 0]] ... [[0 0 0 ... 0 0 0] [0 0 0 ... 0 0 0] [0 0 0 ... 0 0 0]] [[0 0 0 ... 0 0 0] [0 0 0 ... 0 0 0] [0 0 0 ... 0 0 0]] [[0 0 0 ... 0 0 0] [0 0 0 ... 0 0 0] [0 0 0 ... 0 0 0]]] #データ形式 (18, 3, 1000)

コメント(2)の中身

#データ内容 [[[0 0 0 ... 0 0 0]] [[0 0 0 ... 0 0 0]] [[0 0 0 ... 0 0 0]] ... [[0 0 0 ... 0 0 0]] [[0 0 0 ... 0 0 0]] [[0 0 0 ... 0 0 0]]] #データ形式 (18, 1, 1000)

コメント(3)の中身

# データ内容 [[0 0 0 ... 0 0 0] [0 0 0 ... 0 0 0] [0 0 0 ... 0 0 0] ... [0 0 0 ... 0 0 0] [0 0 0 ... 0 0 0] [0 0 0 ... 0 0 0]] #データ形式 (18, 1000)

コメント(4)の中身

#データ内容 [[[0 0 0 ... 0 0 0] [0 0 0 ... 0 0 0] [0 0 0 ... 0 0 0]]] #データ形式 (1, 3, 1000)

predictメソッドを実行した際に出力されるエラー文言

--------------------------------------------------------------------------- InvalidArgumentError Traceback (most recent call last) <ipython-input-54-8021a9079097> in <module>() 11 print(x_input.shape) 12 ---> 13 yhat = model.predict(x_input, batch_size=2, verbose=0) 14 15 #print(yhat) 6 frames /usr/local/lib/python3.7/dist-packages/tensorflow/python/eager/execute.py in quick_execute(op_name, num_outputs, inputs, attrs, ctx, name) 58 ctx.ensure_initialized() 59 tensors = pywrap_tfe.TFE_Py_Execute(ctx._handle, device_name, op_name, ---> 60 inputs, attrs, num_outputs) 61 except core._NotOkStatusException as e: 62 if name is not None: InvalidArgumentError: Specified a list with shape [18,1000] from a tensor with shape [1,1000] [[node sequential_2/lstm_2/TensorArrayUnstack/TensorListFromTensor (defined at <ipython-input-44-c1377d111e30>:13) ]] [Op:__inference_predict_function_9471] Function call stack: predict_function

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

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

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

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

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

toast-uz

2021/05/09 00:41 編集

回答がつきやすくするには、以下の観点でご質問を見直すとよいでしょう。 (質問を取り下げる必要はなく、書き換えればよいです) ・1つの質問で聞きたいことは1つに絞りましょう。特に質問(3)は他の質問と関連があまりありません。質問領域の知識を完全に持つ回答者に巡り合うのはレアケースなので、基本的には回答者は自分の知識をベースに調べ物をして回答します。よって、質問が多いと敬遠します。 ・参考サイトのコードを出発点とするのであれば、なるべく簡便かつできれば公式のものを使いましょう。英文ブログのコードが出発点だと、それだけで回答を得る確率は低くなります。 ・参考としたエビデンスはちゃんと書きましょう。「若干予測が良い的なことが記載されているページを何個かみました」では、見ている人には伝わりません。またサイトの記述で質問があるのであれば、そのサイトで質問するべきです。その手段を選ばずにTeratailに質問を出した意図を明確にしておくと、回答しやすくなるでしょう。
imonikai

2021/05/10 04:38

ありがとうございます。 書き直してみます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問