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

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

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

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

Q&A

解決済

1回答

633閲覧

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

sigefuji

総合スコア125

Python 3.x

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

0グッド

0クリップ

投稿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]

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

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

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

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

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

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(ほどほどクラスを)を入手しようかと思案中です。
guest

回答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

総合スコア7651

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問