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

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

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

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

Q&A

解決済

ValueError: Shapes (None, 1) and (None, 4) are incompatible

takuyyy
takuyyy

総合スコア1

Python

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

1回答

0グッド

0クリップ

550閲覧

投稿2022/10/10 10:43

編集2022/10/10 11:30

前提

4種類の画像判別をkerasに沿って、訓練を実行しようとしていたら以下のエラーメッセージが発生しました。

発生している問題・エラーメッセージ

Epoch 1/50 --------------------------------------------------------------------------- ValueError Traceback (most recent call last) <ipython-input-174-04e2080d51ec> in <module> 3 validation_data=val_ds, 4 batch_size=32, ----> 5 epochs=50 6 ) 1 frames /usr/local/lib/python3.7/dist-packages/keras/utils/traceback_utils.py in error_handler(*args, **kwargs) 65 except Exception as e: # pylint: disable=broad-except 66 filtered_tb = _process_traceback_frames(e.__traceback__) ---> 67 raise e.with_traceback(filtered_tb) from None 68 finally: 69 del filtered_tb /usr/local/lib/python3.7/dist-packages/tensorflow/python/framework/func_graph.py in autograph_handler(*args, **kwargs) 1145 except Exception as e: # pylint:disable=broad-except 1146 if hasattr(e, "ag_error_metadata"): -> 1147 raise e.ag_error_metadata.to_exception(e) 1148 else: 1149 raise ValueError: in user code: File "/usr/local/lib/python3.7/dist-packages/keras/engine/training.py", line 1021, in train_function * return step_function(self, iterator) File "/usr/local/lib/python3.7/dist-packages/keras/engine/training.py", line 1010, in step_function ** outputs = model.distribute_strategy.run(run_step, args=(data,)) File "/usr/local/lib/python3.7/dist-packages/keras/engine/training.py", line 1000, in run_step ** outputs = model.train_step(data) File "/usr/local/lib/python3.7/dist-packages/keras/engine/training.py", line 860, in train_step loss = self.compute_loss(x, y, y_pred, sample_weight) File "/usr/local/lib/python3.7/dist-packages/keras/engine/training.py", line 919, in compute_loss y, y_pred, sample_weight, regularization_losses=self.losses) File "/usr/local/lib/python3.7/dist-packages/keras/engine/compile_utils.py", line 201, in __call__ loss_value = loss_obj(y_t, y_p, sample_weight=sw) File "/usr/local/lib/python3.7/dist-packages/keras/losses.py", line 141, in __call__ losses = call_fn(y_true, y_pred) File "/usr/local/lib/python3.7/dist-packages/keras/losses.py", line 245, in call ** return ag_fn(y_true, y_pred, **self._fn_kwargs) File "/usr/local/lib/python3.7/dist-packages/keras/losses.py", line 1790, in categorical_crossentropy y_true, y_pred, from_logits=from_logits, axis=axis) File "/usr/local/lib/python3.7/dist-packages/keras/backend.py", line 5083, in categorical_crossentropy target.shape.assert_is_compatible_with(output.shape) ValueError: Shapes (None, 1) and (None, 4) are incompatible

該当のソースコード

python

1#データの分割 2train_ds = tf.keras.preprocessing.image_dataset_from_directory( 3 data_dir, 4 validation_split=0.2, 5 subset="training", 6 seed=123, 7 image_size=(img_height, img_width), 8 batch_size=batch_size) 9val_ds = tf.keras.preprocessing.image_dataset_from_directory( 10 data_dir, 11 validation_split=0.2, 12 subset="validation", 13 seed=123, 14 image_size=(img_height, img_width), 15 batch_size=batch_size) 16 17#標準化 18AUTOTUNE = tf.data.AUTOTUNE 19 20train_ds = train_ds.cache().shuffle(1000).prefetch(buffer_size=AUTOTUNE) 21val_ds = val_ds.cache().prefetch(buffer_size=AUTOTUNE) 22 23normalization_layer = layers.experimental.preprocessing.Rescaling(1./255) 24 25normalized_ds = train_ds.map(lambda x, y: (normalization_layer(x), y)) 26image_batch, labels_batch = next(iter(normalized_ds)) 27first_image = image_batch[0] 28print(np.min(first_image), np.max(first_image)) 29 30num_classes = 4 31 32def conv2d(filters, kernel_size, strides=1, bias_init=1, **kwargs): 33 trunc = TruncatedNormal(mean=0.0, stddev=0.01) 34 cnst = Constant(value=bias_init) 35 return Conv2D( 36 filters, 37 kernel_size, 38 strides=strides, 39 padding='same', 40 activation='relu', 41 kernel_initializer=trunc, 42 bias_initializer=cnst, 43 **kwargs 44 ) 45 46def dense(units, **kwargs): 47 trunc = TruncatedNormal(mean=0.0, stddev=0.01) 48 cnst = Constant(value=1) 49 return Dense( 50 units, 51 activation='tanh', 52 kernel_initializer=trunc, 53 bias_initializer=cnst, 54 **kwargs 55 ) 56 57def AlexNet(): 58 model = Sequential() 59 60 # 第1畳み込み層 61 model.add(conv2d(96, 11, strides=(4,4), bias_init=0, input_shape=(224, 224, 3))) 62 model.add(MaxPooling2D(pool_size=(3, 3), strides=(2, 2))) 63 model.add(BatchNormalization()) 64 65 # 第2畳み込み層 66 model.add(conv2d(256, 5, bias_init=1)) 67 model.add(MaxPooling2D(pool_size=(3, 3), strides=(2, 2))) 68 model.add(BatchNormalization()) 69 70 # 第3~5畳み込み層 71 model.add(conv2d(384, 3, bias_init=0)) 72 model.add(conv2d(384, 3, bias_init=1)) 73 model.add(conv2d(256, 3, bias_init=1)) 74 model.add(MaxPooling2D(pool_size=(3, 3), strides=(2, 2))) 75 model.add(BatchNormalization()) 76 77 # 全結合層 78 model.add(Flatten()) 79 model.add(dense(4096)) 80 model.add(Dropout(0.5)) 81 model.add(dense(4096)) 82 model.add(Dropout(0.5)) 83 84 # 出力層 85 model.add(Dense(4, activation='softmax')) 86 87 model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy']) 88 return model 89 90model = AlexNet() 91 92# モデル構成の確認 93model.summary() 94#訓練 95history = model.fit( 96 train_ds, 97 validation_data=val_ds, 98 batch_size=32, 99 epochs=50 100)

以下のような質問にはグッドを送りましょう

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

グッドが多くついた質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

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

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

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

2022/10/10 11:24依頼された後にこの質問は修正されています

こちらの質問が他のユーザーから「問題・課題が含まれていない質問」という指摘を受けました。

回答1

0

ベストアンサー

TensorFlowのリファレンスtf.keras.utils.image_dataset_from_directoryをちゃんと読まれましたか?

この関数にはデフォルト引数label_mode='int'が設定されており,ラベルを整数値とした損失関数sparse_categorical_crossentropy用に設定されています.与えたデータが(None, 1)であるのに対して,ネットワークの出力は(None, 4)であることの不整合性からエラーが起きています.

現状のコードは損失関数categorical_crossentropy用にOne-Hot Encodingされたラベルでなくてはならないはずです.したがって,引数label_mode='categorical'を指定しましょう.

投稿2022/10/10 11:48

編集2022/10/10 15:30
PondVillege

総合スコア1066

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

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

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

このような回答には修正を依頼しましょう。

回答へのコメント

takuyyy

2022/10/10 12:55

解決しました!ありがとうございます! しかし、label_mode='int'を使うところがあるはずです。 label_mode='int' plt.figure(figsize=(10, 10)) for images, labels in train_ds.take(1): for i in range(4): ax = plt.subplot(2, 2, i + 1) plt.imshow(images[i].numpy().astype("uint8")) plt.title(class_names[labels[i]]) plt.axis("off") 訓練データの確認のソースコードであり、第一行目にlabel_mode='int'の設定を指定しましたが、以下のエアーが出てきました。 TypeError: only integer scalar arrays can be converted to a scalar index ご指摘のほどよろしくお願いします!
PondVillege

2022/10/10 15:40 編集

そのエアーはclass_names[labels[i]]で生じたもので間違い無いでしょうか? 解答で述べた通り, label_mode='int'で生成されたlabels[i]は整数値になっており, label_mode='categorical'で生成されたlabels[i]はOne-Hot Encodingされている.ということでしたよね, labels[i]と書いた場合,前者は0階のテンソル(scalar),後者は1階のテンソル(array)が得られますが,class_namesというarrayのindexにarrayは使えないよ,scalarしか使えないよ.というエラーだったので, そこで使われているclass_names[labels[i]]はlabel_mode='int'用であることがわかります. しかし,One-Hot Encodingされたlabels[i]とはいえ,その配列においてフラグが立っているindexはnp.argmax()で取得できるので, plt.title(class_names[np.argmax(labels[i])]) とすれば良いだけのことです.このnp.argmax(labels[i])で得られる整数値は,label_mode='int'にしたときのlabels[i]と同じ値になっているはずです. label_mode='int'でも大丈夫なケースは1出力モデルの2値分類のみです.複数出力があるような分類問題のモデルを扱う時点で,argmaxを使うテクニックが常用されることは頭に入れておくべきだと考えます. 上のモデルでlabel_mode='int'を使うところがあるとすれば,それはtrain_dsやval_dsではなくtest_dsのみしか考えられません.テストデータの場合,モデルの出力に対してargmaxを取る必要はあるものの,ラベルの比較は整数同士にできますし,便利な状態であると考えます.が,教師データ群との不整合性が目立ちます.
takuyyy

2022/10/11 02:04

助かりました!本当にありがとうございました!

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

ただいまの回答率
86.02%

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

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

質問する

関連した質問

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

Python

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