前提・実現したいこと
ubuntuのjupyter notebook上でpythonを用いて畳み込みニューラルネットワーク(CNN)を使って"寿司"、"サラダ"、"麻婆豆腐"を見分けるプログラムを作る。
発生している問題・エラーメッセージ
エラーなく実行できたのですが、学習状況を表すグラフが横ばいで全く変化しません。
該当のソースコード
python
1import cnn_model #cnn_modelは下記のcnn_model.pyからインポートする 2import keras 3import matplotlib.pyplot as plt 4import numpy as np 5from sklearn.model_selection import train_test_split 6import cv2 7 8#入力と出力を指定 9im_rows = 32 #画像の縦ピクセル 10im_cols = 32 #画像の横ピクセル 11im_color = 3 #画像の色空間 12in_shape = (im_rows, im_cols, im_color) 13nb_classes = 3 14 15#写真データを読み込み 16photos = np.load('image/photos.npz') 17x = photos['x'] 18y = photos['y'] 19 20#読み込んだデータの三次元配列に変換 21x = x.reshape(-1, im_rows, im_cols, im_color) 22x = x.astype('float32')/255 23#ラベルデータをone-hotベクトルに直す 24y = keras.utils.np_utils.to_categorical(y.astype('int32'),nb_classes) 25 26#学習用とテスト用に分ける 27x_train, x_test, y_train, y_test = train_test_split( 28 x, y, train_size=0.8) 29 30# 学習用データの水増し 31x_new = [] 32y_new = [] 33for i, xi in enumerate(x_train): 34 yi = y_train[i] 35 for ang in range(-30, 30, 5): 36 #回転させる 37 center = (16, 16) 38 mtx = cv2.getRotationMatrix2D(center, ang, 1.0) 39 xi2 = cv2.warpAffine(xi, mtx, (32, 32)) 40 x_new.append(xi2) 41 y_new.append(yi) 42 #更に左右反転させる 43 xi3 = cv2.flip(xi2, 1) 44 x_new.append(xi3) 45 y_new.append(yi) 46 47#水増しした画像を学習用に置き換える 48print('水増し前=',len(y_train)) 49x_train = np.array(x_new) 50y_train = np.array(y_new) 51print('水増し後=',len(y_train)) 52 53#CNNモデルを取得 54model = cnn_model.get_model(in_shape, nb_classes) 55 56#学習を実行 57hist = model.fit(x_train, y_train, 58 batch_size=10, 59 epochs=5, 60 verbose=1, 61 validation_data=(x_test, y_test)) 62 63#モデルを評価 64score = model.evaluate(x_test,y_test,verbose=1) 65print('正解率=', score[1], 'loss=', score[0]) 66 67#学習の様子をグラフへ描画 68#正解率の推移をプロット 69plt.plot(hist.history['acc']) 70plt.plot(hist.history['val_acc']) 71plt.title('Accuracy') 72plt.legend(['train','test'],loc='upper left') 73plt.show() 74 75#ロスの推移をプロット 76plt.plot(hist.history['loss']) 77plt.plot(hist.history['val_loss']) 78plt.title('Loss') 79plt.legend(['train','test'],loc='upper left') 80plt.show() 81 82model.save_weights('./image/photos-model-light.hdf5') 83 84#####################################cnn_model.py############################################ 85import keras 86from keras.models import Sequential 87from keras.layers import Dense, Dropout, Flatten 88from keras.layers import Conv2D, MaxPooling2D 89from keras.optimizers import RMSprop 90 91#CNNのモデルを定義する 92def def_model(in_shape, nb_classes): 93 model = Sequential() 94 model.add(Conv2D(32, 95 kernel_size=(3, 3), 96 activation='relu', 97 input_shape=in_shape)) 98 model.add(Conv2D(32, (3, 3), activation='relu')) 99 model.add(MaxPooling2D(pool_size=(2, 2))) 100 model.add(Dropout(0.25)) 101 102 model.add(Conv2D(64, (3, 3), activation='relu')) 103 model.add(Conv2D(64, (3, 3), activation='relu')) 104 model.add(MaxPooling2D(pool_size=(2, 2))) 105 model.add(Dropout(0.25)) 106 107 model.add(Flatten()) 108 model.add(Dense(512, activation='relu')) 109 model.add(Dropout(0.5)) 110 model.add(Dense(nb_classes, activation='softmax')) 111 return model 112 113#コンパイル済のCNNモデルを返す 114def get_model(in_shape, nb_classes): 115 model = def_model(in_shape, nb_classes) 116 model.compile( 117 loss='categorical_crossentropy', 118 optimizer=RMSprop(), 119 metrics=['accuracy']) 120 return model 121
試したこと
batchサイズの変更、トレーニング用の画像を再取得、トレーニング用の画像の水増し(約5000枚)
回答1件