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

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

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

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

解決済

keras.SimpleRNNの設定2

sigefuji
sigefuji

総合スコア114

Python 3.x

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

1回答

0リアクション

0クリップ

201閲覧

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

import numpy as np import tensorflow as tf from tensorflow import keras import random from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Dense from tensorflow.keras.layers import Activation from tensorflow.keras.layers import SimpleRNN timesteps = 5 #ベクトル長 feature = 1 bat = 10 #ベクトル個数 unit = 3 dense_unit=2 #binary_crossentropy model = Sequential() model.add(SimpleRNN(unit, input_shape=(timesteps,feature), return_sequences=True)) model.add(Dense(dense_unit, activation="linear")) model.compile(loss='binary_crossentropy') model.summary() lx = ((1.0 - (-1.0))*np.random.randn(1000) +1.0)/2.0 y = lx.astype("float32") print("y.size",y.size,"lx.size",lx.size) l_x = np.zeros((bat, timesteps)) #ベクトル長と訓練数の2次元 l_y = np.zeros((bat, 1)) #1ベクトルについて1個の教師データが対応する単位データ長と訓練数の2次元 for offs in range(1): # offs=0 の場合のみ #データ展開規則表の通りにベクトルを生成 for i in range(0, bat): l_x[i] = y[i+offs: i+offs + timesteps] l_y[i] = y[i+offs + timesteps ] history = model.fit(l_x, l_y, epochs=1 ,batch_size=bat, verbose=1)

補足情報(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].

以下のような質問にはリアクションをつけましょう

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

リアクションが多い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

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

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

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

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()があるのですね。

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

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

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

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

ただいまの回答率
86.12%

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

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

質問する

関連した質問

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

Python 3.x

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