ValueError: Input 0 is incompatible with layer flatten_2: expected min_ndim=3, found ndim=2
画像分類をしようとすると上記のようなエラーが出ました.
CNNをはじめて実装したので,原因がよくわかっていません.
わかる方.宜しくお願い致します.
python
#https://qiita.com/hiroeorz@github/items/ecb39ed4042ebdc0a957 from keras.models import Sequential from keras.layers.convolutional import Conv2D from keras.layers import Activation, Dense, Dropout, Flatten, MaxPooling2D from keras.utils.np_utils import to_categorical from keras.optimizers import Adagrad from keras.optimizers import Adam from keras.models import load_model from keras.callbacks import EarlyStopping, ModelCheckpoint, CSVLogger import numpy as np from PIL import Image import os import time import csv start_time = time.time() print("開始時刻: " + str(start_time)) # 学習用のデータを作る. image_list = [] label_list = [] #ハイパーパラメータ #画像サイズ x = 120 y = 120 A = x*y #入力のノード数 #エポック数 B = 500 #バッチサイズ BATCH_SIZE = 32 #学習率 LR = 0.00001 #出力ノード数 output =9 # ./data/train 以下のa,b,cのディレクトリ以下の画像を読み込む。 for dir in os.listdir("data/train"): if dir == ".DS_Store": continue dir1 = "data/train/" + dir label = 0 if dir == "a": # 左下に最大応力:ラベル0 label = 0 elif dir == "b": # 右下に最大応力:ラベル1 label = 1 elif dir == "c": # 右下に最大応力:ラベル1 label = 2 elif dir == "d": # 右下に最大応力:ラベル1 label = 3 elif dir == "e": # 右下に最大応力:ラベル1 label = 4 elif dir == "f": # 右下に最大応力:ラベル1 label = 5 elif dir == "g": # 右下に最大応力:ラベル1 label = 6 elif dir == "h": # 右下に最大応力:ラベル1 label = 7 elif dir == "i": # 右下に最大応力:ラベル1 label = 8 for file in os.listdir(dir1): if file != ".DS_Store": label_list.append(label) #わからない filepath = dir1 + "/" + file image = np.array(Image.open(filepath).resize((x, y))) print(image.shape) print(filepath) image =np.reshape(image, A) print(image.shape) print('\n') image_list.append(image / 255.) # kerasに渡すためにnumpy配列に変換。 image_list = np.array(image_list) # ラベルの配列を1と0からなるラベル配列に変更 # 0 -> [1,0], 1 -> [0,1] という感じ。 Y = to_categorical(label_list) #わからない print("入力データの確認") print(image_list.shape) #np.savetxt("check/input_data_pixel.csv",image_list,delimiter=",") #print("ラベルデータの確認") print(image_list.shape) #np.savetxt("check/label_data.csv",Y,delimiter=",") #CNNの入力は4次元テンソルなので4次元テンソルに変換 image_list =np.expand_dims(image_list, axis=-1) # モデルを生成してニューラルネットを構築 model = Sequential() model.add(Conv2D(32,kernel_size=3,input_shape=(x,y,1),kernel_initializer='random_normal',bias_initializer='zeros')) #畳み込み層#32:カーネル数 3×3:カーネルサイズ model.add(Activation('relu')) model.add(Conv2D(32,kernel_size=3,kernel_initializer='random_normal',bias_initializer='zeros'))#畳み込み層 model.add(Activation('relu')) model.add(MaxPooling2D(pool_size=(2,2)))#プーリング層 model.add(Dropout(0.25)) model.add(Conv2D(64,kernel_size=3,kernel_initializer='random_normal',bias_initializer='zeros'))#畳み込み層 model.add(Activation('relu')) model.add(Conv2D(64,kernel_size=3,kernel_initializer='random_normal',bias_initializer='zeros'))#畳み込み層 model.add(Activation('relu')) model.add(MaxPooling2D(pool_size=(2,2)))#プーリング層 model.add(Dropout(0.25)) model.add(Flatten()) model.add(Dense(100)) #全結合層 model.add(Activation('relu')) model.add(Dropout(0.5)) model.add(Flatten()) model.add(Dense(10)) #全結合層 model.add(Activation('relu')) model.add(Dropout(0.0)) model.add(Dense(output)) model.add(Activation("softmax")) # オプティマイザ(最適化)にAdamを使用 opt = Adam(lr=LR) # モデルをコンパイル model.compile(loss="categorical_crossentropy", optimizer=opt, metrics=["accuracy"]) #わからない #CSVに各エポックの学習結果の保存 csv_logger = CSVLogger('result/training.csv') # 学習を実行。20%はテストに使用。 history = model.fit(image_list, Y, nb_epoch=B,verbose=1,callbacks=[csv_logger], batch_size=BATCH_SIZE, validation_split=0.3) # テスト用ディレクトリ(./data/train/)の画像でチェック。正解率を表示する。 total = 0. ok_count = 0. #最終の学習結果の表示 loss, accuracy = model.evaluate(image_list, Y) print("\nloss:{} accuracy:{}".format(loss, accuracy)) #最終の学習結果を書き込む fp = open("result/RESULT.txt","w") fp.write("\nloss:{} accuracy:{}".format(loss, accuracy)) fp.close() #正解率の書き込み f = open("result/ANSWER.txt","w") for dir in os.listdir("data/train"): if dir == ".DS_Store": continue dir1 = "data/test/" + dir label = 0 if dir == "a": # 左下に最大応力:ラベル0 label = 0 elif dir == "b": # 右下に最大応力:ラベル1 label = 1 elif dir == "c": # 右下に最大応力:ラベル1 label = 2 elif dir == "d": # 右下に最大応力:ラベル1 label = 3 elif dir == "e": # 右下に最大応力:ラベル1 label = 4 elif dir == "f": # 右下に最大応力:ラベル1 label = 5 elif dir == "g": # 右下に最大応力:ラベル1 label = 6 elif dir == "h": # 右下に最大応力:ラベル1 label = 7 elif dir == "i": # 右下に最大応力:ラベル1 label = 8 for file in os.listdir(dir1): if file != ".DS_Store": label_list.append(label) filepath = dir1 + "/" + file image = np.array(Image.open(filepath).resize((x, y))) print(filepath) image =np.reshape(image, A) result = model.predict_classes(np.array([image / 255.])) print("label:", label, "result:", result[0]) L = label R = result[0] f.write(filepath) f.write("\nlabel:{} result:{}\n".format(L, R) ) total += 1. if label == result[0]: ok_count += 1. print("正答率: ", ok_count / total * 100, "%") SEIKAI =ok_count / total * 100 f.write("\n正答率:{}".format(SEIKAI)) end_time = time.time() print("終了時刻: ",end_time) print ("かかった時間: ", (end_time - start_time)) ttime = end_time - start_time fa = open("result/TIME.txt","w") fa.write("\nかかった時間:{} ".format(ttime)) fa.close()
まだ回答がついていません
会員登録して回答してみよう