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

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

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

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

Q&A

解決済

1回答

539閲覧

keras.SimpleRNNの設定2

sigefuji

総合スコア125

Python 3.x

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

0グッド

0クリップ

投稿2022/09/29 12:56

編集2022/09/29 22:49

前提

時系列データt0~tnがある。(t0からtnに向かって変化。t0が古い))
時刻T0~T9の変化に対して
T=0に対してはt0~t4、T9に対してはt9~t13の時刻データベクトル(以下単にvec0からvec9)を
配列tr_xに作る。

###訓練データ展開表

時刻    訓練データ     教師データ T=0 vec0 t0,t1,t2,t3,t4   teach0 = t5 T=1 vec1 t1,t2,t3,t4,t5 teach1 = t6 T=2 vec2 t2,t3,t4,t5,t6 teach2 = t7 T=3 vec3 t3,t4,t5,t6,t7 teach3 = t8 T=4 vec4 t4,t5,t6,t7,t8 teach4 = t9 T=5 vec5 t5,t6,t7,t8,t9 teach5 = t10 T=6 vec6 t6,t7,t8,t9,t10 teach6 = t11 T=7 vec7 t7,t8,t9,t10,t11 teach7 = t12 T=8 vec8 t8,t9,t10,t11,t12 teach8 = t13 T=9 vec9 t9,t10,t11,t12,t13 teach9 = t14

vecnを訓練データとし、teachnを教師データとする。teachnの値はtn=t(n+5)とする。
つまり5期間のデータにたいして、その次の期間を教師データとする。

この訓練データと教師データでSimpleRNNによる学習コードを考えた。
データは疑似的に乱数で与えている。
実行の結果下記のエラーが発生。

エラーメッセージ

その1エラーはトレースからmodel.fit()と思われる

その1  ValueError: in user code: その2 ValueError: Dimensions must be equal, but are 10 and 5 for '{{node binary_crossentropy/mul}} = Mul[T=DT_FLOAT](IteratorGetNext:1, binary_crossentropy/Log)' with input shapes: [10,1], [10,5,2].

該当のソースコード

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 Activation 8from tensorflow.keras.layers import SimpleRNN 9 10 11timesteps = 5 #ベクトル長 12feature = 1 13bat = 10 #ベクトル個数 14unit = 3 15dense_unit=2 #binary_crossentropy 16 17model = Sequential() 18model.add(SimpleRNN(unit, input_shape=(timesteps,feature), return_sequences=True)) 19 20model.add(Dense(dense_unit, activation="linear")) 21model.compile(loss='binary_crossentropy') 22 23model.summary() 24 25lx = ((1.0 - (-1.0))*np.random.randn(1000) +1.0)/2.0 26y = lx.astype("float32") 27print("y.size",y.size,"lx.size",lx.size) 28 29l_x = np.zeros((bat, timesteps)) #ベクトル長と訓練数の2次元 30l_y = np.zeros((bat, 1)) #1ベクトルについて1個の教師データが対応する単位データ長と訓練数の2次元 31 32 33for offs in range(1): # offs=0 の場合のみ 34 #データ展開規則表の通りにベクトルを生成 35 for i in range(0, bat): 36 l_x[i] = y[i+offs: i+offs + timesteps] 37 l_y[i] = y[i+offs + timesteps ] 38 39 history = model.fit(l_x, l_y, epochs=1 ,batch_size=bat, verbose=1) 40 41

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

コンソールリスト

Model: "sequential_110"


Layer (type) Output Shape Param #

simple_rnn_110 (SimpleRNN) (None, 5, 3) 15

dense_110 (Dense) (None, 5, 2) 8

===============
Total params: 23
Trainable params: 23
Non-trainable params: 0


y.size 1000 l_x.size 1000
tr_x.size 50
tr_y.size 10
Traceback (most recent call last):

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

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

File "C:\Users\qhtsi.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\qhtsi\AppData\Local\Temp_autograph_generated_file2liw4k4m.py", line 15, in tf__train_function
retval
= ag__.converted_call(ag__.ld(step_function), (ag__.ld(self), ag__.ld(iterator)), None, fscope)

***ValueError: in user code:
File C:\Users\qhtsi.conda\envs\py38tfkr\lib\site-packages\keras\engine\training.py", line 1051, in train_function *
return step_function(self, iterator)
File C:\Users\qhtsi.conda\envs\py38tfkr\lib\site-packages\keras\engine\training.py", line 1040, in step_function
outputs = model.distribute_strategy.run(run_step, args=(data,))
File :\Users\qhtsi.conda\envs\py38tfkr\lib\site-packages\keras\engine\training.py", line 1030, in run_step **
outputs = model.train_step(data)
File :\Users\qhtsi.conda\envs\py38tfkr\lib\site-packages\keras\engine\training.py", line 890, in train_step
loss = self.compute_loss(x, y, y_pred, sample_weight)
File :\Users\qhtsi.conda\envs\py38tfkr\lib\site-packages\keras\engine\training.py", line 948, in compute_loss
return self.compiled_loss(
File :\Users\qhtsi.conda\envs\py38tfkr\lib\site-packages\keras\engine\compile_utils.py", line 201, in call
loss_value = loss_obj(y_t, y_p, sample_weight=sw)
File "C:\Users\qhtsi.conda\envs\py38tfkr\lib\site-packages\keras\losses.py", line 139, in call
losses = call_fn(y_true, y_pred)
File "C:\Users\qhtsi.conda\envs\py38tfkr\lib\site-packages\keras\losses.py", line 243, in call **
return ag_fn(y_true, y_pred, **self._fn_kwargs)
File "C:\Users\qhtsi.conda\envs\py38tfkr\lib\site-packages\keras\losses.py", line 1930, in binary_crossentropy
backend.binary_crossentropy(y_true, y_pred, from_logits=from_logits),
File "C:\Users\qhtsi.conda\envs\py38tfkr\lib\site-packages\keras\backend.py", line 5298, in binary_crossentropy
bce = target * tf.math.log(output + epsilon())
*** ValueError: Dimensions must be equal, but are 10 and 5 for '{{node binary_crossentropy/mul}} = Mul[T=DT_FLOAT](IteratorGetNext:1, binary_crossentropy/Log)' with input shapes: [10,1], [10,5,2].

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

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

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

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

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

jbpb0

2022/09/30 06:09

> model.compile(loss='binary_crossentropy') 「binary_crossentropy」の場合は、「dense_unit=1」です 参考 https://keras.io/ja/getting-started/sequential-model-guide/ の下記のコード例 「MLPを用いた二値分類:」 「LSTMを用いた系列データ分類:」 「1D Convolutionを用いた系列データ分類:」
jbpb0

2022/09/30 06:40 編集

> 5期間のデータにたいして、その次の期間を教師データとする。 > 時刻    訓練データ     教師データ T=0 vec0 t0,t1,t2,t3,t4   teach0 = t5 説明変数が5個、目的変数が1個ですね コードが実際に目的変数1個になってるか確認します ただし、上のコメントの「dense_unit=1」は修正済みとします データは、 > history = model.fit(l_x, l_y, epochs=1 ,batch_size=bat, verbose=1) のすぐ上に「print(l_y.shape)」を追加して実行したら「(10, 1)」と表示され、「1」が目的変数の個数なので大丈夫です 一方、ネットワークの定義は、 > model.summary() の結果表示から、出力部分のshapeは「(None, 5, 1) 」で、「5」が余分です データのshapeが「(10, 1)」なのだから、「(None, 1) 」じゃないとダメです 「5」は「timesteps = 5」によるもので、 https://teratail.com/questions/q3m52q9r18u0ys の「質問への追記・修正の依頼」に対策を書いてるので、参照してください 下記で始まるコメントです > 質問のコードの「input_shape=」を直してから「model.summary()」で確認したら分かりますが、出力に「SimpleRNN」の「timesteps」も反映されるので、それを直す必要があると思います
sigefuji

2022/09/30 10:03

何時もアドバイスありがとうございます。 >binary_crossentropy」の場合は、「dense_unit=1」です そうですね。dense_unit=1」でエラーのないことはわかりました。 他の2022/09/30 15:40のコメントは検討中です。
sigefuji

2022/09/30 11:38

>の結果表示から、出力部分のshapeは「(None, 5, 1) 」で、「5」が余分です データのshapeが「(10, 1)」なのだから、「(None, 1) 」じゃないとダメです えーと、この部分今一つわかりかねます。 でも、今までは次元数の一致だけに着目しているだけですので、今からは実データに形式上は似ていて、再現性があり、動作の確認もしやすいと考えた、設定3で検討を進めたいと思います。
jbpb0

2022/09/30 13:00

>> データのshapeが「(10, 1)」なのだから、「(None, 1) 」じゃないとダメです > えーと、この部分今一つわかりかねます。 ネットワークの出力のshapeと、教師データの目的変数(l_y)のshapeは、一致してないとダメです (ただし、先頭の数値はバッチサイズなので、それだけは一致しなくてもいい) だって、ネットワークの出力が教師データの目的変数にできるだけ近くなるように学習するのですよ shapeが一致してなければ、近いかどうか比較ができないでしょう
jbpb0

2022/09/30 13:13

https://keras.io/ja/getting-started/sequential-model-guide/ の「Stacked LSTMを用いた系列データ分類」のコードを見てください lstm層が三つ連続してて、最初の二つには「return_sequences=True」がありますけど、三つ目にはありませんよね 次に、コードの上の箱形の図を見てください 最初の二つのlstm層の出力のshapeは (None, 8, 32) ですが、三つ目のlstm層の出力のshapeは (None, 32) で「8」が無くなってますよね 「8」が無くなってるのは、三つ目のlstm層に「return_sequences=True」が無いためです 上記の「8」は、この質問のコードの > 出力部分のshapeは「(None, 5, 1) 」で、「5」が余分です の「5」と同じものです このように、「rnn系の層の最後で、次がdense層になる層」のみ「return_sequences=True」を付けなければ、ネットワークの出力から余分な次元が消えて、「設定3」のように目的変数に必要無いダミーデータを付ける必要は無くなります この質問のコードでは、rnn系の層は「SimpleRNN」層が一つだけなので、それが「rnn系の層の最後で、次がdense層になる層」になるので、それに「return_sequences=True」を付けなければ、ダミーデータは要りません
sigefuji

2022/10/01 02:07

なるほど、最後のdense直前の層にはreturn_sequences=Trueをつけないことですか。 今朝からこの余分な次元の問題を考えていて、最後のdense層の直前にFlattenを呼べばよいことに気が付き、投稿しようとして、このコメントに気がつきました。 最後の全結合のdense層の入力は、すべて1次元に直しておくことになのですね。そのようにして計算するとかを思い出して。その方法として2通りあったのですね。 これで、やっと長い悩みが解決しましたので、先に進めます。 では設定3は削除申請します。 ありがとうございました。
sigefuji

2022/10/01 02:48

model.summary()の他に、plot_model()があるのですね。
guest

回答1

0

自己解決

最後の全結合のdense層の入力は、すべて1次元に直しておく。
方法1
最後のdense層の直前の層には、「return_sequences=True」をつけない。
jbpb0さん 2022/09/30 22:13のご指摘の通り。
方法2
最後の全結合dense層の直前の層に、Flatten層を置く

投稿2022/10/01 23:09

sigefuji

総合スコア125

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問