前提・実現したいこと
KerasのCNNで画像を2クラスに分類するモデルを学習し、そのモデルを用いて、新たな別画像の判定結果を出力するプログラムを作成したいです。
学習時のラベルは0と1で、2値に分類しています。
学習精度として、Test accuracyが約0.8です。
しかし、判定プログラムでの出力がどの画像に対しても[[1. 0.]]になってしまいます。
「1」と判定した画像の出力は[[0. 1.]]となるのかと考えていましたが、全ての画像で上記出力になります...
判定結果「0」と「1」を正しく出力できるよう、判定プログラムを改良していただけないでしょうか...?
よろしくお願いいたします。
学習プログラム(alexnet.py)
# coding:utf-8 import keras from keras.layers import Conv2D, MaxPooling2D, Lambda, Input, Dense, Flatten, BatchNormalization from keras.utils import np_utils from keras.models import Sequential from keras.layers.convolutional import Conv2D, MaxPooling2D from keras.layers.core import Dense, Dropout, Activation, Flatten import numpy as np from sklearn.model_selection import train_test_split from PIL import Image import glob from keras.utils import plot_model import matplotlib.pyplot as plt import tensorflow as tf folder = ["0","1"] image_size = 224 epoch_size = 10 X = [] Y = [] for index, name in enumerate(folder): dir = "./" + name files = glob.glob(dir + "/*.jpg") for i, file in enumerate(files): image = Image.open(file) image = image.convert("RGB") image = image.resize((image_size, image_size)) data = np.asarray(image) X.append(data) Y.append(index) #Xは画像データ、Yは正解ラベルのデータ X = np.array(X) Y = np.array(Y) #画像データを0から1の範囲に変換 X = X.astype('float32') X = X / 255.0 #正解ラベルの形式を変換 #つまり、ラベルを[0, 0, 0, 1]のようなベクトルにする。値はラベルの数に合わせる。 Y = np_utils.to_categorical(Y, 2) # 学習用データとテストデータに分割 #train_test_split 関数はデータをランダムに、好きの割合で分割できる関数。 #X_train(訓練データ), X_test(テストデータ), y_train(訓練ラベル), y_test(テストラベル) #test_sizeはテストデータにする割合 X_train, X_test, y_train, y_test = train_test_split(X, Y, test_size=0.25) model = Sequential() model.add(Conv2D(48, 11, strides=(3, 3), activation='relu', padding='same',input_shape=X_train.shape[1:])) model.add(MaxPooling2D(pool_size=(3, 3), strides=(2, 2))) model.add(BatchNormalization()) model.add(Conv2D(128, 5, strides=(3, 3), activation='relu', padding='same')) model.add(MaxPooling2D(pool_size=(3, 3), strides=(2, 2))) model.add(BatchNormalization()) model.add(Conv2D(192, 3, strides=(1, 1), activation='relu', padding='same')) model.add(Conv2D(192, 3, strides=(1, 1), activation='relu', padding='same')) model.add(Conv2D(128, 3, strides=(1, 1), activation='relu', padding='same')) model.add(MaxPooling2D(pool_size=(3, 3), strides=(2, 2))) model.add(BatchNormalization()) model.add(Flatten()) model.add(Dense(2048, activation='relu')) model.add(Dropout(0.5)) model.add(Dense(2048, activation='relu')) model.add(Dropout(0.5)) model.add(Dense(2, activation='softmax')) #model.add(Activation('softmax')) model.summary(); model.compile(loss='categorical_crossentropy',optimizer='SGD',metrics=['accuracy']) history = model.fit(X_train, y_train, epochs=epoch_size, verbose=1, validation_split=0.15) #評価 & 評価結果出力 #print(model.evaluate(X_test, y_test)) score = model.evaluate(X_test, y_test, verbose=0) print('Test loss :', score[0]) print('Test accuracy :', score[1]) # モデルをプロット plot_model(model, to_file='./model3.png') #loss: 訓練データの損失値 #val_loss: テストデータの損失値 loss = history.history['loss'] val_loss = history.history['val_loss'] # lossのグラフ plt.plot(range(epoch_size), loss, marker='.', label='loss') plt.plot(range(epoch_size), val_loss, marker='.', label='val_loss') plt.legend(loc='best', fontsize=10) plt.grid() plt.xlabel('epoch') plt.ylabel('loss') plt.show() #acc: 訓練データの精度 #val_acc: テストデータの精度 acc = history.history['acc'] val_acc = history.history['val_acc'] # accuracyのグラフ plt.plot(range(epoch_size), acc, marker='.', label='acc') plt.plot(range(epoch_size), val_acc, marker='.', label='val_acc') plt.legend(loc='best', fontsize=10) plt.grid() plt.xlabel('epoch') plt.ylabel('acc') plt.show() ### save weights json_string = model.to_json() open('alexnet_model.json', 'w').write(json_string) model.save_weights('alexnet_weights.h5') _____________________________________________________________
保存済みの重みデータ
alexnet_model.json
alexnet_weights.h5
###判定プログラム(judge_alexnet.py)
from keras.models import model_from_json import numpy as np from keras.preprocessing import image model = model_from_json(open('alexnet_model.json').read()) model.load_weights('alexnet_weights.h5') #判定したい画像 filename = 'gazou.jpg' img = image.load_img(filename, target_size=(224, 224)) x = image.img_to_array(img) x = np.expand_dims(x, axis=0) features = model.predict(x) #判定結果 print(features)

回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/09/29 08:09
2018/09/29 08:55