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

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

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

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

解決済

keras.sequentiol.LSTMの入力データが負値でエラー

sigefuji
sigefuji

総合スコア114

Python 3.x

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

1回答

0グッド

0クリップ

281閲覧

投稿2022/10/02 06:31

前提

kerasのsequentialモデルでLSTMを使おうとして、
参考サイト https://keras.io/ja/getting-started/sequential-model-guide/
を参考に実行しましたが、
Embedding層の入力でマイナスがあったらしいエラーが出ます。
Embedding層はよくわかりませんが、何かデータの形式整理とか正規化らしき処理のようで、並行処理もやるようで、走行のたびにエラーの位置、値が変化します。
試しにEnbedding層をスキップすると、LSTMは事前にその種らしきの処理が必要となります。
と言うことから、LSTMは負値データはできないのでしょうか。
SimpleRNNはそのようなことはありません。どんな理由があるでしょうか。

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

その1 InvalidArgumentError: Graph execution error: その2 Node: 'sequential_29/embedding_25/embedding_lookup' indices[0,5] = -1 is not in [0, 50)

該当のソースコード

python

1import numpy as np 2import tensorflow as tf 3from tensorflow import keras 4import random 5from tensorflow.keras.models import Sequential 6from tensorflow.keras.layers import Dense 7from tensorflow.keras.layers import Flatten 8from tensorflow.keras.layers import Activation 9from tensorflow.keras.layers import SimpleRNN 10from tensorflow.keras.layers import Embedding 11from tensorflow.keras.layers import LSTM 12from tensorflow.keras.layers import Dropout 13from IPython.display import SVG 14from keras.utils import plot_model 15 16offsct=10 17tstep = 10 #ベクトル長 18feature = 1 19ncat=15 # 主力カテゴリー数 20bat = 50 #ベクトル個数 21unit = 100 #第1層のunit数 22dense_unit = ncat #出力クラスが3個 categorical__crossentropy 23max_features = bat 24 25model = Sequential() 26model.add(Embedding(max_features,output_dim=20)) 27model.add(LSTM(64)) 28#model.add(Flatten()) 29#model.add(Dropout(0.5)) 30model.add(Dense(1, activation='sigmoid')) 31model.add(Dense(dense_unit, activation="softmax")) 32model.compile(loss='categorical_crossentropy', 33 optimizer='rmsprop', 34 metrics=['accuracy']) 35 36#plot_model(model) 37 38model.summary() 39 40y = np.zeros(6*bat) 41y[0] = 0 42y[1] = 1 43y[2] = 1 44y[3] = 0 45y[4] = 0 46y[5] = -1 47 48for n in range(1,bat): 49 for i in range(0,6): 50 y[6*n+i] = y[i] 51print(y) 52 53 54#y = l_x.astype("float32") 55print("y.size",y.size) 56 57l_x = np.zeros((bat,tstep)) 58l_y = np.zeros((bat, 1)) 59cl_y = np.zeros((bat,ncat)) 60#print(cl_y) 61for offs in range(1): # offs=0 の場合のみ 62 63 for i in range(0, bat): 64 for j in range(0, tstep): 65 l_x[i,j] = y[i+offs +j] 66 67 l_y[i] = y[i+offs+1 ] 68 69 cl_y[i] = tf.keras.utils.to_categorical(l_y[i], ncat) 70 #print(i,"cl_y",cl_y[i]) 71 72 #tr_x = l_x.reshape(bat, ts, 1) 73 #tr_y = l_y.reshape(bat, 1) 74 print("tr_x.size",l_x.size) 75 print("tr_y.size",l_y.size) 76 #print("shape",l_x.shape,l_y.shape,cl_y.shape) 77 78 history = model.fit(l_x, cl_y, epochs=1 ,batch_size=bat, verbose=1) 79

補足情報 コンソール出力

Model: "sequential_29"


Layer (type) Output Shape Param #

embedding_25 (Embedding) (None, None, 20) 1000

lstm_27 (LSTM) (None, 64) 21760

dense_56 (Dense) (None, 1) 65

dense_57 (Dense) (None, 15) 30

=================================================================
Total params: 22,855
Trainable params: 22,855
Non-trainable params: 0


[ 0. 1. 1. 0. 0. -1. 0. 1. 1. 0. 0. -1. 0. 1. 1. 0. 0. -1.
0. 1. 1. 0. 0. -1. 0. 1. 1. 0. 0. -1. 0. 1. 1. 0. 0. -1.
0. 1. 1. 0. 0. -1. 0. 1. 1. 0. 0. -1. 0. 1. 1. 0. 0. -1.

          1. -1. 0. 1. 1. 0. 0. -1.]

y.size 300
tr_x.size 500
tr_y.size 50
Traceback (most recent call last):

File "C:\Users\.conda\envs\py38tfkr\lib\site-packages\spyder_kernels\py3compat.py", line 356, in compat_exec
exec(code, globals, locals)

File "c:\book\rnn1\lstmtest.py", line 78, in <module>
history = model.fit(l_x, cl_y, epochs=1 ,batch_size=bat, verbose=1)

File "C:\Users\.conda\envs\py38tfkr\lib\site-packages\keras\utils\traceback_utils.py", line 67, in error_handler
raise e.with_traceback(filtered_tb) from None

File "C:\Users\.conda\envs\py38tfkr\lib\site-packages\tensorflow\python\eager\execute.py", line 54, in quick_execute
tensors = pywrap_tfe.TFE_Py_Execute(ctx._handle, device_name, op_name,

InvalidArgumentError: Graph execution error:

Detected at node 'sequential_29/embedding_25/embedding_lookup' defined at (most recent call last):
File "C:\Users\.conda\envs\py38tfkr\lib\runpy.py", line 194, in _run_module_as_main
return _run_code(code, main_globals, None,
File "C:\Users\.conda\envs\py38tfkr\lib\site-packages\keras\layers\core\embedding.py", line 199, in call
out = tf.nn.embedding_lookup(self.embeddings, inputs)
Node: 'sequential_29/embedding_25/embedding_lookup'
indices[0,5] = -1 is not in [0, 50)
[[{{node sequential_29/embedding_25/embedding_lookup}}]] [Op:__inference_train_function_100589]

以下のような質問にはグッドを送りましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

グッドが多くついた質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

jbpb0

2022/10/02 16:03

google colabで質問のコードを全部そのまま実行したら、 ImportError: cannot import name 'plot_model' from 'keras.utils' (/usr/local/lib/python3.7/dist-packages/keras/utils/__init__.py) というエラーが出たので、「from keras.utils import plot_model」の行を削除して、他はそのままで実行したら、エラー出ずに実行できました
sigefuji

2022/10/02 23:59

ご返事ありがとうございます。 素直に考えると、環境になりそうですが、以前に似たような問題では他におかしな現象があったので環境かもと思うきっかけはあったのですが、 今回はそのようなことがうかがえません。 最初に述べておくべしだったかも知れませんが、データを y[5]=-1 のところ y[5]=0 とすると、通りますので、負値が問題だと思ったのです。 しかし、通る環境があるのでは、困りました。組み合わせたバージョンの可能性もあるかも知れないし。 どなたかが言われていましたが、kerasは便利だけれど一筋縄ではいかないと。使いこなすには敷居が高い。
jbpb0

2022/10/03 02:07 編集

> 通る環境があるのでは、困りました。 google colabで、再度確認しました ランタイム → ランタイムのタイプを変更 → ハードウェア アクセラレータ:GPU だと、エラー出ません 最初のコメントを書いた時は、この条件で実行しました ランタイム → ランタイムのタイプを変更 → ハードウェア アクセラレータ:None だと、下記のエラーが出ました File "/usr/local/lib/python3.7/dist-packages/keras/layers/embeddings.py", line 197, in call out = tf.nn.embedding_lookup(self.embeddings, inputs) Node: 'sequential/embedding/embedding_lookup' indices[0,5] = -1 is not in [0, 50) [[{{node sequential/embedding/embedding_lookup}}]] [Op:__inference_train_function_2830] どちらの場合も、「from keras.utils import plot_model」の行は削除してます
jbpb0

2022/10/03 02:32 編集

> File "C:\Users\.conda\envs\py38tfkr\lib\site-packages\keras\layers\core\embedding.py", line 199, in call out = tf.nn.embedding_lookup(self.embeddings, inputs) Node: 'sequential_29/embedding_25/embedding_lookup' indices[0,5] = -1 is not in [0, 50) [[{{node sequential_29/embedding_25/embedding_lookup}}]] [Op:__inference_train_function_100589] エラー出てるのは、LSTM層じゃなくてEmbedding層ですよね > データを y[5]=-1 のところ y[5]=0 とすると、通りますので、負値が問題だと思ったのです。 https://keras.io/ja/layers/embeddings/ に「正の整数(インデックス)を固定次元の密ベクトルに変換します.」と書いてあるので、Embedding層の入力がマイナスだとダメ、ということでは? (ハードウェア アクセラレータ:GPUだとエラー出ないのは謎ですが) 上記Webページの「引数」の「input_dim:」に「語彙数.入力データの最大インデックス + 1.」とあり、この質問のコードだとそれは「max_features = bat = 50」なので、Embedding層の入力は0〜50-1=0〜49の範囲の整数しかダメで、エラーの「not in [0, 50)」はその範囲から外れてる、という意味なのでしょう 【追記】 質問を読み返したら、 > Embedding層の入力でマイナスがあったらしいエラーが出ます。 と書かれてました LSTM層じゃなくてEmbedding層でエラーが出てるのは認識されてるのですね それでしたら、質問のあちこちに書かれてる「LSTM」を「Embedding」に書き換えて、Embedding層の入力はマイナスはダメな仕様、ってことで解決ですかね
jbpb0

2022/10/03 03:07 編集

> LSTMは負値データはできないのでしょうか。 SimpleRNNはそのようなことはありません。 https://teratail.com/questions/nv15nzr94k05m3 「keras.SimpleRNNの設定2」のコードを下記のように変更して実行しても、エラー出ません from tensorflow.keras.layers import SimpleRNN ↓ from tensorflow.keras.layers import LSTM dense_unit=2 #binary_crossentropy ↓ dense_unit=1 #binary_crossentropy model.add(SimpleRNN(unit, input_shape=(timesteps,feature), return_sequences=True)) ↓ model.add(LSTM(unit, input_shape=(timesteps,feature))) 上記以外は全てそのままなので、ネットワークの入力(l_x)にはマイナスの値も含まれてるので、ネットワークの最初の層であるLSTM層にマイナスの値も入力されてますが、大丈夫です マイナス入力がダメなのは、LSTM層じゃなくてEmbedding層です 【追記】 > 試しにEnbedding層をスキップすると、LSTMは事前にその種らしきの処理が必要となります。 この質問のコードを下記のように変更して実行しても、エラー出ません from keras.utils import plot_model を削除 model.add(Embedding(max_features,output_dim=20)) model.add(LSTM(64)) ↓ 変更 model.add(LSTM(64, input_shape=(tstep,feature))) 上記以外は全てそのままなので、ネットワークの入力(l_x)にはマイナスの値も含まれてるので、ネットワークの最初の層であるLSTM層にマイナスの値も入力されてますが、大丈夫です
sigefuji

2022/10/03 05:22

いろいろ試していただいてありがとうございます。 >マイナス入力がダメなのは、LSTM層じゃなくてEmbedding層です 正確にはそのとおりです。LSTMに必要な条件もEmbedding層でチェックしているかと思ったのです。 試しにEmbedding層を外してみる発想はあるいは良かったかもしれませんが、方法がまずかった。input_shapeを忘れていました。(input_shapeはこのように使うことあらためて認識) Embedding層の目的、条件はよくわかりませんが、どんな入力データもLSTMで同様に処理できるような仕掛けらしいが、その詳細は不明です。そうゆうことであれば、LSTMを使う際はその特性に配慮したデータを入力する立場なので、特にEmbedding層は不要と思います。訳の分かった範囲で使いたいです。 単にサンプルを使うだけではだめです。とはいっても通るベースがあってのことですが。 環境による差はどうなったでしょうね。
jbpb0

2022/10/03 06:32

> 環境による差はどうなったでしょうね。 google colabでgpu使った時にエラーが出ないのが変なのだと思いますが、理由は分かりません
sigefuji

2022/10/03 12:22

GPUのときエラー無しで、CPUのとき有りだと、こちら(cpu)ありと、符合することになりますね。 ときどき見かける情報では、GPUの有無で何か差があることもあるようです。推測するに、GPUの演算バージョンはあまり変化ないのに対して、CPUは演算機構に大きな差があり(sse1,2,3,4とかavx,avx2とかetc.)それらの最適化バージョンによる微妙な差があり得るかなと。ただ、そのことを考慮してCPU版では最小限の最適化で互換性を保つライブラリーもあるやに聞きますが・・・、気になるところです。 互換性にてこづるので、そろそろGPU(ほどほどクラスを)を入手しようかと思案中です。

回答1

0

ベストアンサー

LSTMは負値データはできないのでしょうか。
SimpleRNNはそのようなことはありません。

この質問のコードを下記のように変更して実行しても、エラー出ません

 

python

1from keras.utils import plot_model

を削除

 

python

1model.add(Embedding(max_features,output_dim=20)) 2model.add(LSTM(64))

↓ 変更

python

1model.add(LSTM(64, input_shape=(tstep,feature)))

 
上記以外は全てそのままなので、ネットワークの入力(l_x)にはマイナスの値も含まれてるので、ネットワークの最初の層であるLSTM層にマイナスの値も入力されてますが、大丈夫です

投稿2022/10/07 10:26

jbpb0

総合スコア7491

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

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

ただいまの回答率
86.12%

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

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

質問する

関連した質問

同じタグがついた質問を見る

Python 3.x

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