前提・実現したいこと
Pythonで3種類の動物の画像を用意し、別の画像がそのいずれかを推定するプログラムを実行したいです。
画像はFlickrからとってきています。
発生している問題・エラーメッセージ
ValueError: Error when checking input: expected conv2d_1_input to have shape (75, 75, 3) but got array with shape (50, 50, 3)
該当のソースコード
Python
1from keras.models import Sequential, load_model 2from keras.layers import Conv2D, MaxPooling2D 3from keras.layers import Activation, Dropout, Flatten, Dense 4# from keras.utils import np_utils 5import keras,sys 6import numpy as np 7from PIL import Image 8 9classes = ["monkey","boar","crow"] 10num_classes = len(classes) 11image_size = 50 12 13def build_model(): 14 model = Sequential() 15 model.add(Conv2D(32,(3,3), padding='same',input_shape=(50,50,3))) 16 model.add(Activation('relu')) 17 model.add(Conv2D(32,(3,3))) 18 model.add(Activation('relu')) 19 model.add(MaxPooling2D(pool_size=(2,2))) 20 model.add(Dropout(0.25)) 21 22 model.add(Conv2D(64,(3,3), padding='same')) 23 model.add(Activation('relu')) 24 model.add(Conv2D(64,(3,3))) 25 model.add(Activation('relu')) 26 model.add(MaxPooling2D(pool_size=(2,2))) 27 model.add(Dropout(0.25)) 28 29 model.add(Flatten()) 30 model.add(Dense(512)) 31 model.add(Activation('relu')) 32 model.add(Dropout(0.5)) 33 model.add(Dense(3)) 34 model.add(Activation('softmax')) 35 36 opt = keras.optimizers.rmsprop(lr=0.0001, decay=1e-6) 37 38 model.compile(loss='categorical_crossentropy',optimizer=opt,metrics=['accuracy']) 39 40 # モデルのロード 41 model = load_model('./animal_cnn_aug.h5') 42 43 return model 44 45def main(): 46 image = Image.open(sys.argv[1]) 47 image = image.convert('RGB') 48 image = image.resize((image_size,image_size)) 49 data = np.asarray(image)/255 50 X = [] 51 X.append(data) 52 X = np.array(X) 53 model = build_model() 54 55 result = model.predict([X])[0] 56 predicted = result.argmax() 57 percentage = int(result[predicted] * 100) 58 print("{0} ({1} %)".format(classes[predicted], percentage)) 59 60if __name__ == "__main__": 61 main()
なお、モデルのロードに記載してあるモデルの保存は以下から行なっています
python
1from keras.models import Sequential 2from keras.layers import Conv2D, MaxPooling2D 3from keras.layers import Activation, Dropout, Flatten, Dense 4from keras.utils import np_utils 5import keras 6import numpy as np 7 8classes = ["monkey","boar","crow"] 9num_classes = len(classes) 10image_size = 50 11 12#メインの関数を定義する 13def main(): 14 X_train, X_test, y_train, y_test = np.load("./animal_aug.npy") 15 X_train = X_train.astype("float") / 256 16 X_test = X_test.astype("float") / 256 17 y_train = np_utils.to_categorical(y_train, num_classes) 18 y_test = np_utils.to_categorical(y_test, num_classes) 19 20 model = model_train(X_train, y_train) 21 model_eval(model, X_test, y_test) 22 23def model_train(X, y): 24 model = Sequential() 25 model.add(Conv2D(32,(3,3), padding='same',input_shape=X.shape[1:])) 26 model.add(Activation('relu')) 27 model.add(Conv2D(32,(3,3))) 28 model.add(Activation('relu')) 29 model.add(MaxPooling2D(pool_size=(2,2))) 30 model.add(Dropout(0.25)) 31 32 model.add(Conv2D(64,(3,3), padding='same')) 33 model.add(Activation('relu')) 34 model.add(Conv2D(64,(3,3))) 35 model.add(Activation('relu')) 36 model.add(MaxPooling2D(pool_size=(2,2))) 37 model.add(Dropout(0.25)) 38 39 model.add(Flatten()) 40 model.add(Dense(512)) 41 model.add(Activation('relu')) 42 model.add(Dropout(0.5)) 43 model.add(Dense(3)) 44 model.add(Activation('softmax')) 45 46 opt = keras.optimizers.rmsprop(lr=0.0001,decay=1e-6) 47 model.compile(loss='categorical_crossentropy',optimizer=opt,metrics=['accuracy']) 48 model.fit(X, y, batch_size=32, epochs=100) 49 50#モデルの保存 51 model.save('./animal_cnn_aug.h5') 52 53 return model 54 55def model_eval(model, X, y): 56 scores = model.evaluate(X, y, verbose=1) 57 print('Test Loss:', scores[0]) 58 print('Test Accuracy:', scores[1]) 59 60if __name__ == "__main__": 61 main()
試したこと
- 75というサイズで入力した箇所がないか確認(ありませんでした)
- image_sizeを変更して実行
- パッケージのアップグレード
補足情報(FW/ツールのバージョンなど)
macOS/anaconda/Jupyter Notebook/Atom
PillowやTensorflowは最新のものにアップグレードしています。
はじめてプログラミングをはじめたところなのでオンライン教材の一貫です。コピーしている箇所が多く、単語も都度本を見ながらという感じなので初歩的なミスかもしれませんが、ご覧いただければ幸いです。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2019/03/09 21:20 編集
2019/03/09 04:02