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

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

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

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

Q&A

解決済

1回答

2802閲覧

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

takuyyy

総合スコア1

Python

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

0グッド

0クリップ

投稿2022/10/10 10:43

編集2022/10/11 11:04

前提

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)

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

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

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

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

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

guest

回答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

総合スコア1579

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

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

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問