前提
時系列データ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].
回答1件
あなたの回答
tips
プレビュー