tensorflowを勉強中の者です。
モデルの学習を実施しようとしたとき、以下のエラー文が出てきました。
error
1Input 0 of layer lstm_34 is incompatible with the layer: expected ndim=3, found ndim=4. Full shape received: (None, 32, 24, 7)
モデルの冒頭は以下の通りです。
python
1model = tf.keras.models.Sequential([ 2 tf.keras.layers.LSTM(32, input_shape=[32,24,7], return_sequences=True), 3 tf.keras.layers.LSTM(60, return_sequences=True), 4 tf.keras.layers.Dense(30, activation="relu"), 5 (以下略) 6 ::
trainingのために入力しているデータの形を確認したところ、
上記のモデルのinput_shapeで指定している形と一致しているように思います。
check
1for elm in training_data_set: 2 print(elm)
out
1(<tf.Tensor: shape=(32, 24, 7), dtype=float64, numpy=array([[[0.※以降数字が続く…
モデルの中の、以下の箇所を[None,32,24,7],に変更してみると、
mychange
1input_shape=[32,24,7], 2→input_shape=[None,32,24,7],
error
1Input 0 of layer lstm_36 is incompatible with the layer: expected ndim=3, found ndim=5. Full shape received: (None, None, 32, 24, 7)
上記のように表示され、事態が悪化しているように見受けられます。
モデルの学習時に、trainingデータのinputshapeで学習して欲しいのですが、
その指定の方法がよくわからず困っております。。。
以下、追記させていただきます
本件ご確認と修正のご依頼をいただきまして誠にありがとうございました。
以下に、確認した内容を記載させていただきます。
【お伺い点1】
ご教示いただきました通りmodel.summary()にて、一番左がNoneであることを確認いたしました。
モデル側はあくまでノードの数を指定する箇所で、Noneは入ってくるデータ数が任意だよと示しているように思ったのですが、我々が意図的にサンプル数(バッチサイズ=32、窓幅(一つのバッチで何行与えるか)=24、特徴量の数=7)をモデル定義時点で指定することは不可能という理解で正しいでしょうか。(※現状、バッチの数のコントロールはtraining_data_set側で実施し、窓幅(行数)と特徴量の数の指定のみをモデル側で定義するという認識でいます。)
result
1Model: "sequential" 2_________________________________________________________________ 3Layer (type) Output Shape Param # 4================================================================= 5lstm (LSTM) (None, 24, 32) 5120 6_________________________________________________________________ 7bidirectional (Bidirectional (None, 24, 120) 44640 8_________________________________________________________________ 9dense (Dense) (None, 24, 30) 3630 10_________________________________________________________________ 11dense_1 (Dense) (None, 24, 10) 310 12_________________________________________________________________ 13dense_2 (Dense) (None, 24, 7) 77 14================================================================= 15Total params: 53,777 16Trainable params: 53,777 17Non-trainable params: 0 18_________________________________________________________________
ちなみに、繰り返しになりますが、input shapeを以下のようにinput_shape=[32,24,7]にすると、上述の通り、errorが出てきます。これを踏まえて、バッチ数はモデル側で指定しないものだと認識しております。。。
model
1model = tf.keras.models.Sequential([ 2 tf.keras.layers.LSTM(32, input_shape=[32,24,7],return_sequences=True),#input_shape has changed 3 tf.keras.layers.Bidirectional(tf.keras.layers.LSTM(60, return_sequences=True)), 4 tf.keras.layers.Dense(30, activation="relu"),
【お伺い点2】
training_data_setの要素毎ではなく、以下の通り、全体の確認を試行いたしました。
1print(train_set)
printresult
1<PrefetchDataset shapes: ((None, None, 7), (None, None, 7)), types: (tf.float64, tf.float64)>
上記のとおり、((None, None, 7), (None, None, 7))となっておりました。
1つ目は問題、2つ目は正解データで構成された教師データあるという認識です。
イメージとしては、ここで((32, 24, 7), (32, 24, 7))となっているかなと想像しておりましたが、何故かNone,Noneとなっておりました。おそらく、バッチ数=32、窓幅=24 共に、特定のデータの切り方に対するひとかたまりでであるため、表示されず、生データの一行辺りに有する7つの特徴量という情報が最小単位なので、それが表示されたのかなと想像しておりますが、その認識で正しいでしょうか。
ちなみに、以下の手順にて、
なんとなくではありますが、training_data_set全体の形を確認いたしました。
list
1list(training_data_set) 2 3→[(<tf.Tensor: shape=(32, 24, 7), dtype=float64, numpy=array([[[0.43…(以下略)
要素としては、前回同様、意図したとおりの(32,24,7)のデータになっていることが分かりました。
次に、データの長さを以下にて確認いたしました。
len
1len(list(training_data_set)) 2 3→1349 #バッチ数32と掛け合わせて、全データの行数と一致することを確認。
次に、リストにした初めの要素の中身と要素数を確認いたしました。
list
1list(training_data_set)[0] 2 3→(<tf.Tensor: shape=(32, 24, 7), dtype=float64, numpy=array([[[0.433
len
1len(list(training_data_set)[0]) 2 3→2 4 # 上述の通り、1つ目は問題、2つ目は正解データで構成された教師データあるという認識でして、 5 # 理由はわかりませんが、この手法ですと、(None,None,7)ではなく、 6 # (32, 24, 7)が二つあるということが確認できました。
次に、念のための確認のため、以下を実施いたしました。
check
1len(list(training_data_set)[0][0]) 2→32 3 4len(list(training_data_set)[0][0][0]) 5→24 6 7len(list(training_data_set)[0][0][0][0]) 8→7
以上、お手数をおかけし恐縮ではございますが、どうかご確認をよろしくお願いいたします。