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

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

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

Kerasは、TheanoやTensorFlow/CNTK対応のラッパーライブラリです。DeepLearningの数学的部分を短いコードでネットワークとして表現することが可能。DeepLearningの最新手法を迅速に試すことができます。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

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

Q&A

1回答

10541閲覧

ValueError: Input 0 is incompatible with layer flatten_2: expected min_ndim=3, found ndim=2

FALLOT

総合スコア16

Keras

Kerasは、TheanoやTensorFlow/CNTK対応のラッパーライブラリです。DeepLearningの数学的部分を短いコードでネットワークとして表現することが可能。DeepLearningの最新手法を迅速に試すことができます。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

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

0グッド

0クリップ

投稿2018/12/06 12:15

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

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

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

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

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

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

guest

回答1

0

Flatten()は、直前のConv層の3次元出力を1次元に平滑します。

すでに1度平滑化しており、Dense層に通した出力は1次元です。
よって、2つ目(エラーメッセージにも"flatten_2"とありますね)のFlatten層をなくせば、解決すると思われます。

ちなみに、"found ndim=2"というのは、(batch_size,output_of_dense)というshapeを持つ入力を受け取ったということです。
Dense層の出力は1次元と前述したので、念のため。

投稿2019/02/19 00:59

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

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

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問