Q&A
ValueError: Input 0 is incompatible with layer flatten_2: expected min_ndim=3, found ndim=2
画像分類をしようとすると上記のようなエラーが出ました.
CNNをはじめて実装したので,原因がよくわかっていません.
わかる方.宜しくお願い致します.
python
1 2#https://qiita.com/hiroeorz@github/items/ecb39ed4042ebdc0a957 3 4from keras.models import Sequential 5from keras.layers.convolutional import Conv2D 6from keras.layers import Activation, Dense, Dropout, Flatten, MaxPooling2D 7from keras.utils.np_utils import to_categorical 8from keras.optimizers import Adagrad 9from keras.optimizers import Adam 10from keras.models import load_model 11from keras.callbacks import EarlyStopping, ModelCheckpoint, CSVLogger 12import numpy as np 13from PIL import Image 14import os 15import time 16import csv 17 18 19start_time = time.time() 20print("開始時刻: " + str(start_time)) 21 22# 学習用のデータを作る. 23image_list = [] 24label_list = [] 25 26#ハイパーパラメータ 27#画像サイズ 28x = 120 29y = 120 30A = x*y #入力のノード数 31#エポック数 32B = 500 33#バッチサイズ 34BATCH_SIZE = 32 35#学習率 36LR = 0.00001 37#出力ノード数 38output =9 39 40 41# ./data/train 以下のa,b,cのディレクトリ以下の画像を読み込む。 42for dir in os.listdir("data/train"): 43 if dir == ".DS_Store": 44 continue 45 46 dir1 = "data/train/" + dir 47 label = 0 48 49 if dir == "a": # 左下に最大応力:ラベル0 50 label = 0 51 elif dir == "b": # 右下に最大応力:ラベル1 52 label = 1 53 elif dir == "c": # 右下に最大応力:ラベル1 54 label = 2 55 elif dir == "d": # 右下に最大応力:ラベル1 56 label = 3 57 elif dir == "e": # 右下に最大応力:ラベル1 58 label = 4 59 elif dir == "f": # 右下に最大応力:ラベル1 60 label = 5 61 elif dir == "g": # 右下に最大応力:ラベル1 62 label = 6 63 elif dir == "h": # 右下に最大応力:ラベル1 64 label = 7 65 elif dir == "i": # 右下に最大応力:ラベル1 66 label = 8 67 68 69 for file in os.listdir(dir1): 70 if file != ".DS_Store": 71 label_list.append(label) #わからない 72 filepath = dir1 + "/" + file 73 image = np.array(Image.open(filepath).resize((x, y))) 74 print(image.shape) 75 print(filepath) 76 image =np.reshape(image, A) 77 print(image.shape) 78 print('\n') 79 image_list.append(image / 255.) 80 81 82# kerasに渡すためにnumpy配列に変換。 83image_list = np.array(image_list) 84 85 86 87 88# ラベルの配列を1と0からなるラベル配列に変更 89# 0 -> [1,0], 1 -> [0,1] という感じ。 90Y = to_categorical(label_list) #わからない 91 92print("入力データの確認") 93print(image_list.shape) 94#np.savetxt("check/input_data_pixel.csv",image_list,delimiter=",") 95#print("ラベルデータの確認") 96print(image_list.shape) 97#np.savetxt("check/label_data.csv",Y,delimiter=",") 98#CNNの入力は4次元テンソルなので4次元テンソルに変換 99image_list =np.expand_dims(image_list, axis=-1) 100 101 102# モデルを生成してニューラルネットを構築 103model = Sequential() 104 105model.add(Conv2D(32,kernel_size=3,input_shape=(x,y,1),kernel_initializer='random_normal',bias_initializer='zeros')) #畳み込み層#32:カーネル数 3×3:カーネルサイズ 106model.add(Activation('relu')) 107model.add(Conv2D(32,kernel_size=3,kernel_initializer='random_normal',bias_initializer='zeros'))#畳み込み層 108model.add(Activation('relu')) 109model.add(MaxPooling2D(pool_size=(2,2)))#プーリング層 110model.add(Dropout(0.25)) 111 112model.add(Conv2D(64,kernel_size=3,kernel_initializer='random_normal',bias_initializer='zeros'))#畳み込み層 113model.add(Activation('relu')) 114model.add(Conv2D(64,kernel_size=3,kernel_initializer='random_normal',bias_initializer='zeros'))#畳み込み層 115model.add(Activation('relu')) 116model.add(MaxPooling2D(pool_size=(2,2)))#プーリング層 117model.add(Dropout(0.25)) 118 119model.add(Flatten()) 120model.add(Dense(100)) #全結合層 121model.add(Activation('relu')) 122model.add(Dropout(0.5)) 123 124model.add(Flatten()) 125model.add(Dense(10)) #全結合層 126model.add(Activation('relu')) 127model.add(Dropout(0.0)) 128 129 130model.add(Dense(output)) 131model.add(Activation("softmax")) 132 133# オプティマイザ(最適化)にAdamを使用 134opt = Adam(lr=LR) 135# モデルをコンパイル 136model.compile(loss="categorical_crossentropy", optimizer=opt, metrics=["accuracy"]) #わからない 137#CSVに各エポックの学習結果の保存 138csv_logger = CSVLogger('result/training.csv') 139# 学習を実行。20%はテストに使用。 140history = model.fit(image_list, Y, nb_epoch=B,verbose=1,callbacks=[csv_logger], batch_size=BATCH_SIZE, validation_split=0.3) 141 142 143 144# テスト用ディレクトリ(./data/train/)の画像でチェック。正解率を表示する。 145total = 0. 146ok_count = 0. 147#最終の学習結果の表示 148loss, accuracy = model.evaluate(image_list, Y) 149print("\nloss:{} accuracy:{}".format(loss, accuracy)) 150#最終の学習結果を書き込む 151fp = open("result/RESULT.txt","w") 152fp.write("\nloss:{} accuracy:{}".format(loss, accuracy)) 153fp.close() 154#正解率の書き込み 155f = open("result/ANSWER.txt","w") 156 157for dir in os.listdir("data/train"): 158 if dir == ".DS_Store": 159 continue 160 161 dir1 = "data/test/" + dir 162 label = 0 163 164 if dir == "a": # 左下に最大応力:ラベル0 165 label = 0 166 elif dir == "b": # 右下に最大応力:ラベル1 167 label = 1 168 elif dir == "c": # 右下に最大応力:ラベル1 169 label = 2 170 elif dir == "d": # 右下に最大応力:ラベル1 171 label = 3 172 elif dir == "e": # 右下に最大応力:ラベル1 173 label = 4 174 elif dir == "f": # 右下に最大応力:ラベル1 175 label = 5 176 elif dir == "g": # 右下に最大応力:ラベル1 177 label = 6 178 elif dir == "h": # 右下に最大応力:ラベル1 179 label = 7 180 elif dir == "i": # 右下に最大応力:ラベル1 181 label = 8 182 183 184 for file in os.listdir(dir1): 185 if file != ".DS_Store": 186 label_list.append(label) 187 filepath = dir1 + "/" + file 188 image = np.array(Image.open(filepath).resize((x, y))) 189 print(filepath) 190 image =np.reshape(image, A) 191 result = model.predict_classes(np.array([image / 255.])) 192 print("label:", label, "result:", result[0]) 193 L = label 194 R = result[0] 195 f.write(filepath) 196 f.write("\nlabel:{} result:{}\n".format(L, R) ) 197 total += 1. 198 199 if label == result[0]: 200 ok_count += 1. 201 202 203 204 205print("正答率: ", ok_count / total * 100, "%") 206SEIKAI =ok_count / total * 100 207f.write("\n正答率:{}".format(SEIKAI)) 208 209end_time = time.time() 210print("終了時刻: ",end_time) 211print ("かかった時間: ", (end_time - start_time)) 212 213ttime = end_time - start_time 214fa = open("result/TIME.txt","w") 215fa.write("\nかかった時間:{} ".format(ttime)) 216fa.close() 217 218
下記のような回答は推奨されていません。
このような回答には修正を依頼しましょう。