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

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

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

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

1回答

2605閲覧

tensorflowでのエラー:LSTMモデルへの入力データの形が合わない (None, )とは…?

bobby2128

総合スコア42

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/07/23 06:53

編集2022/01/12 10:55

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の要素毎ではなく、以下の通り、全体の確認を試行いたしました。

print

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

以上、お手数をおかけし恐縮ではございますが、どうかご確認をよろしくお願いいたします。

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

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

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

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

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

jbpb0

2021/07/25 09:15 編集

> (None, )とは…? model = tf.keras.models.Sequential([... でネットワークを定義したら、その次に model.summary() を追加して実行したら分かりますけど、一番左の「None」はサンプル数のことです > trainingのために入力しているデータの形を確認したところ、 上記のモデルのinput_shapeで指定している形と一致しているように思います。 「training_data_set」内の各データを個別に見るのではなく、「training_data_set」全体の形を見たら、 (サンプル数, 32, 24, 7) となっていますでしょうか?
jbpb0

2021/07/26 01:51

> 意図的にサンプル数(バッチサイズ=32、窓幅(一つのバッチで何行与えるか)=24、特徴量の数=7)をモデル定義時点で指定することは不可能 「input_shape=」に加えて「batch_size=」で指定 「input_shape=」ではなく「batch_input_shape=」で指定 という方法はあります それが、質問者さんがやりたいことと合致してるのかは分かりませんが 参考1 https://keras.io/ja/getting-started/sequential-model-guide/ の「入力のshapeを指定する」の最後 参考2 同Webページの一番下の「同じようなStacked LSTMを"stateful"にする」 参考3 https://keras.io/getting_started/faq/#how-can-i-use-stateful-rnns の「How can I use stateful RNNs?」
jbpb0

2021/07/26 02:42 編集

https://keras.io/ja/getting-started/sequential-model-guide/ の一番下の「同じようなStacked LSTMを"stateful"にする」のコードでは、下記の通りです model.add(LSTM(...batch_input_shape=(batch_size, timesteps, data_dim))) x_train = np.random.random((batch_size * 10, timesteps, data_dim)) 上記のやり方に合わせたら、下記のようになるような気がします > len(list(train_set)) →1349 #バッチ数32と掛け合わせて、全データの行数と一致することを確認。 は、1349*32=43168 となる (サンプルコードの「x_train」の「batch_size * 10」に相当) > list(train_set)[0] →(<tf.Tensor: shape=(32, 24, 7), dtype=float64, numpy=array([[[0.433 は、shape=(24, 7) となる (サンプルコードの「x_train」の「timesteps, data_dim」に相当) つまり、データ作成でバッチサイズ毎に区切ってまとめる必要はないのではないかと また、同参考コードでは、下記の通りです x_train = np.random.random((batch_size * 10, timesteps, data_dim)) y_train = np.random.random((batch_size * 10, num_classes)) model.fit(x_train, y_train... 上記のやり方に合わせたら、下記のようになるような気がします > len(list(train_set)[0]) →2 は、1となる (サンプルコードの「x_train」のみに相当) つまり、問題データと正解データは分けてネットワークに入れて学習させるのではないかと
guest

回答1

0

少し、機械学習から離れてしまったので間違っているかもしれませんが参考になればと思います。

Noneは任意の数を表します。
今回の例で示すと、インプットするデータは
[32, 24, 7]のサイズのデータを64件程度まとめて、
[64, 32, 24, 7]等のデータで学習します。

今回、おそらく1件のみをinputとして入れている
もしくは途中の関数が間違っており、エラーの出る箇所で1件のみのデータとなっているのではないでしょうか

ひとまず試しであれば1件でも大丈夫ですので
入力データを[1, 32, 24, 7]等にリサイズして実行してみてください。

検討違いであればすみません。

投稿2021/07/25 08:38

ko.tu

総合スコア178

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

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

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

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問