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

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

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

Q&A

解決済

1回答

1195閲覧

ValueError: Input 0 of layer conv2d_1 is incompatible with the layer:

katakori99

総合スコア15

0グッド

0クリップ

投稿2022/06/08 22:32

機械学習初心者です。Anacondaで環境を作り、JupyterNotebookで試しています。
以下のようにエラーが出ました。

ValueError Traceback (most recent call last) Input In [33], in <cell line: 9>() 6 print("test Accuracy: ", scores[1]) 8 # モデル学習実行 ----> 9 model = main() Input In [29], in main() 16 """ 17 ②モデル学習&評価 18 """ 19 #モデル学習 ---> 20 model = model_train(X_train,y_train) 22 #モデル評価 23 evaluate(model,X_test, y_test) Input In [32], in model_train(X_train, y_train) 5 model = Sequential() 7 # 1層目 (畳み込み) ----> 8 model.add(Conv2D(32,(3,3),padding="same", input_shape=X_train.shape[1:])) 9 model.add(Activation('relu')) 10 # 2層目(Max Pooling) File ~\anaconda3\envs\TEST-OpenCV\lib\site-packages\tensorflow\python\training\tracking\base.py:530, in no_automatic_dependency_tracking.<locals>._method_wrapper(self, *args, **kwargs) 528 self._self_setattr_tracking = False # pylint: disable=protected-access 529 try: --> 530 result = method(self, *args, **kwargs) 531 finally: 532 self._self_setattr_tracking = previous_value # pylint: disable=protected-access File ~\anaconda3\envs\TEST-OpenCV\lib\site-packages\keras\engine\sequential.py:202, in Sequential.add(self, layer) 197 x = input_layer.Input( 198 batch_shape=batch_shape, dtype=dtype, name=layer.name + '_input') 199 # This will build the current layer 200 # and create the node connecting the current layer 201 # to the input layer we just created. --> 202 layer(x) 203 set_inputs = True 205 if set_inputs: File ~\anaconda3\envs\TEST-OpenCV\lib\site-packages\keras\engine\base_layer.py:976, in Layer.__call__(self, *args, **kwargs) 970 # Functional Model construction mode is invoked when `Layer`s are called on 971 # symbolic `KerasTensor`s, i.e.: 972 # >> inputs = tf.keras.Input(10) 973 # >> outputs = MyLayer()(inputs) # Functional construction mode. 974 # >> model = tf.keras.Model(inputs, outputs) 975 if _in_functional_construction_mode(self, inputs, args, kwargs, input_list): --> 976 return self._functional_construction_call(inputs, args, kwargs, 977 input_list) 979 # Maintains info about the `Layer.call` stack. 980 call_context = base_layer_utils.call_context() File ~\anaconda3\envs\TEST-OpenCV\lib\site-packages\keras\engine\base_layer.py:1114, in Layer._functional_construction_call(self, inputs, args, kwargs, input_list) 1109 training_arg_passed_by_framework = True 1111 with call_context.enter( 1112 layer=self, inputs=inputs, build_graph=True, training=training_value): 1113 # Check input assumptions set after layer building, e.g. input shape. -> 1114 outputs = self._keras_tensor_symbolic_call( 1115 inputs, input_masks, args, kwargs) 1117 if outputs is None: 1118 raise ValueError('A layer\'s `call` method should return a ' 1119 'Tensor or a list of Tensors, not None ' 1120 '(layer: ' + self.name + ').') File ~\anaconda3\envs\TEST-OpenCV\lib\site-packages\keras\engine\base_layer.py:848, in Layer._keras_tensor_symbolic_call(self, inputs, input_masks, args, kwargs) 846 return tf.nest.map_structure(keras_tensor.KerasTensor, output_signature) 847 else: --> 848 return self._infer_output_signature(inputs, args, kwargs, input_masks) File ~\anaconda3\envs\TEST-OpenCV\lib\site-packages\keras\engine\base_layer.py:886, in Layer._infer_output_signature(self, inputs, args, kwargs, input_masks) 880 with backend.name_scope(self._name_scope()): # pylint: disable=not-callable 881 with autocast_variable.enable_auto_cast_variables( 882 self._compute_dtype_object): 883 # Build layer if applicable (if the `build` method has been 884 # overridden). 885 # TODO(kaftan): do we maybe_build here, or have we already done it? --> 886 self._maybe_build(inputs) 887 inputs = self._maybe_cast_inputs(inputs) 888 outputs = call_fn(inputs, *args, **kwargs) File ~\anaconda3\envs\TEST-OpenCV\lib\site-packages\keras\engine\base_layer.py:2633, in Layer._maybe_build(self, inputs) 2630 def _maybe_build(self, inputs): 2631 # Check input assumptions set before layer building, e.g. input rank. 2632 if not self.built: -> 2633 input_spec.assert_input_compatibility( 2634 self.input_spec, inputs, self.name) 2635 input_list = tf.nest.flatten(inputs) 2636 if input_list and self._dtype_policy.compute_dtype is None: File ~\anaconda3\envs\TEST-OpenCV\lib\site-packages\keras\engine\input_spec.py:229, in assert_input_compatibility(input_spec, inputs, layer_name) 227 ndim = x.shape.rank 228 if ndim is not None and ndim < spec.min_ndim: --> 229 raise ValueError('Input ' + str(input_index) + ' of layer ' + 230 layer_name + ' is incompatible with the layer: ' 231 ': expected min_ndim=' + str(spec.min_ndim) + 232 ', found ndim=' + str(ndim) + 233 '. Full shape received: ' + 234 str(tuple(shape))) 235 # Check dtype. 236 if spec.dtype is not None: ValueError: Input 0 of layer conv2d_1 is incompatible with the layer: : expected min_ndim=4, found ndim=1. Full shape received: (None,)

KerasのConv2Dにかかわる問題かなと思いましたが、正直よくわかりません。
教えていただけたら嬉しいです。以下は使用しているコードです。

import tensorflow from keras.models import Sequential from keras.layers import Conv2D, MaxPooling2D from keras.layers import Activation,Dropout,Flatten,Dense from keras.utils import np_utils import numpy as np # クラスラベル labels = ["grape","apple","orange"] # ディレクトリ dataset_dir = r"C:\Users\namek\Desktop\data/dataset.npy" # 前処理済みデータ model_dir = r"C:\Users\namek\Desktop\data/cnn_h5" # 学習済みモデル # リサイズ設定 resize_settings = (50,50) # メインの関数定義 def main(): """ ①データの前処理(エンコーディング) """ # 保存したnumpyデータ読み込み np.lordは(ファイル、こういうもん)でOK X_train,X_test,y_train,y_test = np.load(dataset_dir, allow_pickle=True) # 0~255の整数範囲になっているため、0~1間に数値が収まるよう正規化 #astypeは型の返還 最大値で割ることで正規化できる X_train = X_train.astype("float") / X_train.max() X_test = X_test.astype("float") / X_train.max() # クラスラベルの正解値は1、他は0になるようワンホット表現を適用 #lenはリスト内の要素の数とか つまり3 y_train = np_utils.to_categorical(y_train,len(labels)) y_test = np_utils.to_categorical(y_test,len(labels)) """ ②モデル学習&評価 """ #モデル学習 model = model_train(X_train,y_train) #モデル評価 evaluate(model,X_test, y_test) #モデル学習関数 def model_train(X_train,y_train): #インスタンス model = Sequential() # 1層目 (畳み込み) model.add(Conv2D(32,(3,3),padding="same", input_shape=X_train.shape[1:])) model.add(Activation('relu')) # 2層目(Max Pooling) model.add(Conv2D(32,(3,3))) model.add(Activation('relu')) # 3層目 (Max Pooling) model.add(MaxPooling2D(pool_size=(2,2))) model.add(Dropout(0.3)) # 4層目 (畳み込み) model.add(Conv2D(64,(3,3),padding="same")) model.add(Activation('relu')) # 5層目 (畳み込み) model.add(Conv2D(64,(3,3))) model.add(Activation('relu')) # 6層目 (Max Pooling) model.add(MaxPooling2D(pool_size=(2,2))) # データを1次元化 model.add(Flatten()) # 7層目 (全結合層) model.add(Dense(512)) model.add(Activation('relu')) model.add(Dropout(0.5)) # 出力層(softmaxで0〜1の確率を返す) model.add(Dense(3)) model.add(Activation('softmax')) # 最適化アルゴリズム opt = tensorflow.keras.optimizers.RMSprop(lr=0.005, decay=1e-6) # 損失関数 model.compile(loss="categorical_crossentropy", optimizer=opt, metrics=["accuracy"] ) # モデル学習 model.fit(X_train,y_train,batch_size=10,epochs=150) # モデルの結果を保存 model.save(model_dir) return model # 評価用関数 def evaluate(model,X_test,y_test): # モデル評価 scores = model.evaluate(X_test,y_test,verbose=1) print("Test Loss: ", scores[0]) print("test Accuracy: ", scores[1]) # モデル学習実行 model = main()

宜しくお願い致します。

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

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

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

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

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

jbpb0

2022/06/08 23:11 編集

「def main():」内の model = model_train(X_train,y_train) のすぐ上に下記を(インデントを合わせて)追加して実行したら、 何て表示されますでしょうか? print(X_train.shape) print(y_train.shape)
katakori99

2022/06/08 23:15

(12157500,) (1621, 3) これが表示されました
jbpb0

2022/06/09 00:57

print(X_train.shape) > (12157500,) はダメです 最初の層がConv2Dなので、X_train.shapeは (データ数, 画像縦画素数, 画像横画素数, チャンネル数) となってる必要があります https://qiita.com/takurooo/items/82837e44b466e7634c98 の「2.データの前処理」の「前処理用関数を使って学習/検証/テストデータを生成」の下のコードの、 print(x_train.shape) # (48000, 28, 28, 1) のあたりを見てください (数値は違うと思うので、気にしないでください)
jbpb0

2022/06/09 01:20 編集

print(y_train.shape) > (1621, 3) と、 > resize_settings = (50,50) から類推すると、X_train.shapeが (1621, 50, 50, 3) となるように、うまくreshapeすればいいのかな? 1621*50*50*3=12157500 なので 正確なところは「dataset.npy」を作った人に聞いてください
guest

回答1

0

自己解決

初心者の私にもわかりやすいように説明してくださってありがとうございます。

教えてくださったサイトにも書いてあるようにうまくreshapeすることができれば行けそうです。

迅速に対応して頂きありがとうございます。

投稿2022/06/09 03:02

katakori99

総合スコア15

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問