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

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

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

解決済

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

katakori99
katakori99

総合スコア15

1回答

0評価

0クリップ

184閲覧

投稿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()

宜しくお願い致します。

良い質問の評価を上げる

以下のような質問は評価を上げましょう

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

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

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

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」を作った人に聞いてください

まだ回答がついていません

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

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

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