tensprflow.keras のsequentialモデルのSimpleRNNをテストしています。
下記のコードでこのテストの目的はmodel.fitくらいまで確認したいのですが、最初のSimpleRNNの段階で不整合なエラーとなります。
3次元を期待するが、4次元を検出したとのようです。
公式サイトなどを参照して、色々試行錯誤しましたが、解決には至りません。
正しい設定方法を教えて頂いてもうれしいですが、
このエラーの原因を知りたいです。
・指定したshape(input_shapeのことと推定)が(None, 20, 25, 25)となっていますが、このようにみなされた理由。
・input_shapeの仕様は[batch, timesteps, feature]となっていますが、featurの意味がよくわからない。
conv1d,conv2dでは入力画像のピクセル数となるが、この場合は時間ステップ数となるか?
このRNNネットワークの図的構成図の良いのが見あたりませんが、理解の範囲を言葉で述べておきます。
・隠れ層(unit個)の入力は2要素あって、一つは時系列データのタイムステップ分の入力(ts個)と、一つは隠れ層の出力の一つ前のstep状態(unit個)を合わせた(並べた)ものになる。
・隠れ層の出力は、出力層に全結合する(直前にdropout層をおくこともある)
・今回の場合の出力は複数(3以上)のカテゴリががあり、クロスエントロピー誤差とする。
・クロスエントロピーとするために、fitにはonehotlabelが必要。
他に全体構成を考えるに際し、不明な点があります、あわせてご教示頂ければ幸いです。
・このエラーの直接原因でないが、Denseレイヤーのdense_unitは何か。
SimpleRNNのunitを受け取る全結合のunitで良いか(同じ値を設定)
・出力層のカテゴリー数は、 tf.keras.utils.to_categoricalで生成するshapeに入るカテゴリ数が反映されるとしてよいか。(fitにはカテゴリー数指定が無いので)
・データ生成の別法との比較。1stepづつ与えるのでこの方が良いかとも思う。
参考サイト
・keras公式ページ
https://keras.io/api/layers/recurrent_layers/simple_rnn/
・ RNNの例ですが、数値の値の意味がはっきりしない。
https://www.tensorflow.org/guide/keras/rnn
・以前に教わった日本語サイト
https://note.nkmk.me/python-tensorflow-keras-basics/
・詳解ディープラーニング5章
発生している問題・エラーメッセージ
ValueError: Input 0 of layer "simple_rnn_20" is incompatible with the layer: expected ndim=3, found ndim=4. Full shape received: (None, 20, 25, 25)
該当のソースコード
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 10timesteps = 25 11feature = 25 12cat_size = 11 13bat = 20 14unit = 60 15dense_unit=cat_size 16 17model = Sequential() 18model.add(SimpleRNN(unit, input_shape=(bat,timesteps,feature), return_sequences=True)) 19 # inputs: A 3D tensor, with shape [batch, timesteps, feature]. 20 # batch = bat 21 # timesteps = timesteps 観測する時間ステップ数 22 # feature 特徴だが何を意味。conv1d,conv2dでは入力画像のピクセル数となるが、この場合は時間ステップ数となるか? 23#以下は、この直前でエラーとなるのでコメントにした 24#model.add(Dense(dense_unit, activation="linear")) 25 # unit:隠れ層の数 26#model.compile(loss='binary_crossentropy') 27#model.compile(loss='categorical_crossentropy') 28 29l_x = np.random.random((1000, timesteps)) # 30l_y = np.random.random((1000, cat_size)) 31#データ生成の別法 32#l_x = np.random.random(1000) 33#l_y = np.random.random(1000) 34#l_x = l_x.reshape(-1,1) 35#l_y = l_y.reshape(-1,1) 36 37print("l_y.shape",l_y.shape) 38 39#cl_y = tf.keras.utils.to_categorical(l_y, cat_sz) 40 41#model.summary() 42 43print("cl_y.shape",cl_y.shape) 44 45#history = model.fit(l_x, cl_y, epochs=5, batch_size=bat) 46 47
補足情報(FW/ツールのバージョンなど)
コンソールリスト
runfile('C:/book/rnn1/test3.py', wdir='C:/book/rnn1')
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\test3.py", line 18, in <module>
model.add(SimpleRNN(unit, input_shape=(bat,timesteps,feature), return_sequences=True))
File "C:\Users\qhtsi.conda\envs\py38tfkr\lib\site-packages\tensorflow\python\training\tracking\base.py", line 587, in _method_wrapper
result = method(self, *args, **kwargs)
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.conda\envs\py38tfkr\lib\site-packages\keras\engine\input_spec.py", line 214, in assert_input_compatibility
raise ValueError(f'Input {input_index} of layer "{layer_name}" '
ValueError: Input 0 of layer "simple_rnn_20" is incompatible with the layer: expected ndim=3, found ndim=4. Full shape received: (None, 20, 25, 25)
回答1件
あなたの回答
tips
プレビュー