ミニバッチ学習法で2クラスの画像分類を行いました。実行結果からグラフ(このグラフが妥当なものかはわからないですが…)を作ってみました。
正解率データはあまり差はありませんでしたが、増幅した場合(下)損失関数が非常に高くなりました。これは過学習が起きたということでしょうか。
python
1from keras.models import Sequential 2from keras.layers import Convolution2D, MaxPooling2D 3from keras.layers import Activation, Dropout, Flatten, Dense 4from keras.utils import np_utils 5import keras 6import numpy as np 7 8classes = ["kouroenkawa","kuroguchi"] 9num_classes = len(classes) 10image_width = 50 11image_height = 50 12 13#メインの関数を定義する 14def main(): 15 X_train, X_test, y_train, y_test = np.load("./orido.npy", allow_pickle=True) 16 X_train = X_train.astype("float") / 256 17 X_test = X_test.astype("float") / 256 18 y_train = np_utils.to_categorical(y_train,num_classes) 19 y_test = np_utils.to_categorical(y_test, num_classes) 20 21 model = model_train(X_train, y_train) 22 model_eval(model, X_test, y_test) 23 24def model_train(X, y): 25 model = Sequential() 26 model.add(Convolution2D(32,(3,3),padding='same', input_shape=X.shape[1:])) 27 model.add(Activation('relu')) 28 model.add(Convolution2D(32,(3,3))) 29 model.add(Activation('relu')) 30 model.add(MaxPooling2D(pool_size=(2,2))) 31 model.add(Dropout(0.25)) 32 33 model.add(Convolution2D(64,(3,3),padding='same')) 34 model.add(Activation('relu')) 35 model.add(Convolution2D(64,(3,3))) 36 model.add(Activation('relu')) 37 model.add(MaxPooling2D(pool_size=(2,2))) 38 model.add(Dropout(0.25)) 39 40 model.add(Flatten()) 41 model.add(Dense(512)) 42 model.add(Activation('relu')) 43 model.add(Dropout(0.5)) 44 model.add(Dense(2)) 45 model.add(Activation('softmax')) 46 47 opt = keras.optimizers.rmsprop(lr=0.0001, decay=1e-6) 48 49 model.compile(loss='categorical_crossentropy', optimizer=opt, metrics=['accuracy']) 50 51 model.fit(X, y, batch_size=32, nb_epoch=100) 52 53 #モデルの保存 54 model.save('./orido_cnn.h5') 55 56 return model 57 58def model_eval(model, X, y): 59 scores = model.evaluate(X, y, verbose=1) 60 print('test Loss: ', scores[0]) 61 print('test Accuracy: ', scores[1]) 62 63if __name__ == "__main__": 64 main() 65
グラフが掲載できていないようなので、再編集して載せてみてください。
軸のラベルを忘れていました。
X軸はバッチサイズです。
それぞれどうやって計算しているのか(訓練データなのかテストデータなのか)、増幅のやり方などは追記しておくと回答しやすいかと思います。あとloss functionの種類とかも。
申し訳ありません。初心者の自分が口で説明するより画像でお見せした方が早いと思い、添付しようとしたのですが、なかなかうまくいかなかったので、コードを貼り付けました。
結果はtest lossと表示していたので、テストデータです。増幅は、-20°から20°を5°ずつの回転と反転をやりました。
コードならコードブロック内に入れておいてください。(<code>ボタンで挿入可能)
回答1件
あなたの回答
tips
プレビュー