How to predict on test data set using keras with a trained model
Step1. import 相關套件
#讀取模型與餵圖
Step2. 設定如何取test set圖片
Step3. 讀取訓練好的模型與測試樣本進行預測
Step4. ConfusionMatrix與相關FAR,FRR計算
#運算confusion_matrix
#計算FAR, FRR, precision與recall:
#讀取模型與餵圖
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
留言
張貼留言