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





留言
張貼留言