How to predict on test data set using keras with a trained model

Step1. import 相關套件
#讀取模型與餵圖
from keras.preprocessing.image import ImageDataGenerator
from keras.models import load_model
#confusion_matrix
from sklearn.metrics import classification_report, confusion_matrix
#繪製模型
from keras.utils import plot_model
from IPython.display import SVG
from keras.utils.vis_utils import model_to_dot
#其他相關套件
import numpy as np

Step2. 設定如何取test set圖片
#test樣本共有40張,其寬高是175,89
nb_test_samples=40
img_width, img_height = 175, 89
batch_size_test=nb_test_samples#test時一次直接拉40張進來測試,故batch_size數直接等於樣本數

#利用ImageDataGenerator將test樣本讀進來
test_datagen = ImageDataGenerator(rescale=1. / 255)
test_data_dir = './725kerasFormat/test'
test_generator = test_datagen.flow_from_directory(
        test_data_dir,
        target_size=(img_height, img_width),#所讀圖片高寬將強制resize為(img_height, img_width)
        batch_size=batch_size_test,
        class_mode='categorical', 
        shuffle=False)#test時不能shuffle樣本
這邊可以暫時看看讀入的圖怎麼被label:
tgClass=test_generator.classes
print('tgClass=',tgClass)#無論test_generator內的shuffle為true或false這邊都不影
                         #響,因為test_generator.classes就是按照讀入順序進行label
print('test_generator.class_indices=',test_generator.class_indices)#label 0是表示什麼、
                                                                   #label 1是表示什麼
                         


Step3. 讀取訓練好的模型與測試樣本進行預測
model = load_model('./bestmodel/weights0.3.epoNum:21-val_loss:0.340-val_acc:0.850.hdf5')
stepNum=nb_test_samples// batch_size_test
#利用模型進行預測,記得輸入的test_generator的shuffle內建要是False
Y_pred = model.predict_generator(test_generator, 
                                 steps=stepNum)
看看預測值與分類結果:
#預測值。假設有2類,則上述回傳值Y_pred目前是一個40x2(test樣本數x類別數)的矩陣
print('Y_pred',Y_pred)#預測分數
print('Y_pred.shape',Y_pred.shape)
#分類結果,即每個樣本的判斷結果是什麼。例如兩個類別,y_pred就是0與1,且
#y_pred是(40,)(test樣本數,)的矩陣
y_pred = np.argmax(Y_pred, axis=1)
print('y_pred=',y_pred)

·
·
·


Step4. ConfusionMatrix與相關FAR,FRR計算
#運算confusion_matrix
#test_generator.classes為實際40張測試樣本的label,y_pred為預測的label
confusion_matrixRet=confusion_matrix(y_true=test_generator.classes,y_pred= y_pred)
#show出confusion_matrix的結果
print('confusion_matrix:')
print(confusion_matrixRet)

 


#計算FAR, FRR, precision與recall:
#計算TP,FP,FN,TN與FPR,FNR, precison, recall, f1-score(以類別0當作正樣本算出的)
#下面classification_report則可以回傳以任何label當作正樣本而
#算出的precison, recall, f1-score
TP = confusion_matrixRet[0,0]
FN = confusion_matrixRet[0,1] 
FP = confusion_matrixRet[1,0]
TN = confusion_matrixRet[1,1]
precision = TP/(TP+FP)
recall = TP/(TP+FN)
F1 = (2 * precision * recall)/(precision + recall)
FPR=FP/(FP+TN)
FNR=FN/(FN+TP)
print('FPR=',FPR)
print('FNR=',FNR)

#classification_report, 可以自動算出precision,recall與f1-score
classification_report = classification_report(y_true=test_generator.classes,y_pred= y_pred)
print(classification_report)#會輸出precision、recall與f1-score。
                            #第一列:0,表示以類別0當作正樣本算出的precision、recall與f1-score
                            #第二列:1,表示以類別1當作正樣本算出的precision、recall與f1-score



留言

這個網誌中的熱門文章

[Android] TextView 換行

[Android]android Global variable 寫法

[Android] build the JAR file in Android Studio