-
Notifications
You must be signed in to change notification settings - Fork 0
/
Practica4_Val.py
executable file
·150 lines (98 loc) · 5.13 KB
/
Practica4_Val.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
"""
Practica 4: VALIDATION script:
- per veure l'error amb el conjunt de validacio, mostres etiquetades no vistes a train
Aprenentatge Computacional - Universitat Autonoma de Barcelona
Author: Jordi Gonzalez
"""
from __builtin__ import file
from Practica4_NN import *
from sys import path
import multiprocessing as mp
from scipy.io import *
import numpy as np
from numpy import *
from sklearn.metrics import precision_score, f1_score, recall_score, accuracy_score
import time
import os
path.append('.')
import pickle # save/load data files
from pybrain.tools.shortcuts import buildNetwork
from pybrain.utilities import percentError
# per llegir el classificador on es troba la xarxa neural
parametrosNN={
'Dimensions':199,
'Momentum': 0.6,
'learningrate': 0.105,
'verbose': True,
'weightdecay': 0.01,
'batchlearning': True,
'maxEpochs': 35,
'LrDecay': 1.0,
'ValidationProportion' : 0.01 #sobre els 100 segons (MacBook Pro, 2.6 GHz, RAM 8 GB)
}
def test_image(hist, y_test):
#hist: valors de la imatge actual
#y_test: la classe real
# Hi ha un classificador apres per cada classe
code = zeros(int(nc))
# one-vs-all: mirem la probabilitat de pertanyer a cada una de les 5 classes, i ens quedem amb el maxim
for cidx in range(nc):
#fileNetwork = open(classifierDir+'NN_Dim'+str(parametrosNN['Dimensions'])+'_Epochs'+str(parametrosNN['maxEpochs'])+nom_classes[cidx]+'_vs_all.model', 'wb')
#NN_model = pickle.load(fileNetwork)
NN_model = load_model(classifierDir+'NN_Dim'+str(parametrosNN['Dimensions'])+'_Epochs'+str(parametrosNN['maxEpochs'])+'_'+nom_classes[cidx]+'_vs_all.model')
#NN_model = load_model(fileNetwork)
code[cidx]= NN_model.activate(hist)
y_auto = int(argmax(code)+1)
return (y_test, y_auto)
def test_image_svm(hist, y_test):
# Hi ha un SVM apres per cada classe
code = zeros(int(nc))
# one-vs-all: mirem la probabilitat de pertanyer a cada una de les 5 classes, i ens quedem amb el maxim
for cidx in range(nc):
# carreguem el SVM per una classe: haureu de substituir aquest SVM per una xarxa neuronal
svm_model = svm_load_model(classifierDir+'SVM_'+str(K)+'_'+nom_classes[cidx]+'_vs_all.model')
# mirem la probabilitat de que la mostra de test pertany i aquesta classe en concret, i la de que no pertanyi
decis = svm_model.predict_proba(hist)
# hem de mirar que un 1 significa que pertany a la classe,
if svm_model.classes_[0] == 1:
code[cidx] = decis[0][0]
else:
code[cidx] = decis[0][1]
# ens quedem amb la classe per la que el seu corresponent SVM doni una probabilitat maxima
y_auto = int(argmax(code)+1)
# retornem la classe predita i la classe real, per calcular la matriu de confusio i l'accuracy
return (y_test, y_auto)
# ****************** MAIN **************************
if __name__ == "__main__":
# a canviar, depenent del vostre ordinador
DataOutputFolder =''
classifierDir = DataOutputFolder + 'classifiers/'
# aquest directori s'utilitzara per tal de treure el resultat de la xarxa neural
valDataDir = DataOutputFolder + 'valData/'
if not os.path.isdir(valDataDir): os.mkdir(valDataDir)
nc = 5 # number of classes
nom_classes = ['car','dog','bicycle','motorbike','person']
K = 199 # number of features per inmage
nTestFiles = 50 # number of testing images per classe (al directori valData/ i Dataset/validation/)
# inicialitzacio confusion matrix
confMat = zeros((nc,nc))
confMatSVM = zeros((nc,nc))
for c_test in range(nc): # calculem els errors per totes les classes
# carregar l'arxiu on estan representades les 50 imatges de test amb 199 parametres
f = open(valDataDir +'test_data_class_'+str(c_test+1)+'.pkl', 'rb')
testData = pickle.load(f);
labels = pickle.load(f)
# per cada una de les 50 imatges de la classe de les 5 que estem avaluant
for num_im in range(nTestFiles):
# hist conte la representacio de la imatge, es un vector de 199 dimensions
hist = testData[num_im];
(class_real, class_assigned) = test_image(hist, c_test+1)
# (class_real_svm, class_assigned_svm) = test_image_svm(hist, c_test+1)
# mirem a quina classe es fa la prediccio, sabem la classe real a la que pertany
confMat[class_real-1,class_assigned-1] += 1
# confMatSVM[class_real_svm-1,class_assigned_svm-1] += 1
#print 'test:', int(np.sum(confMat)), '-> real vs prediccio:', class_real, 'vs.', class_assigned, '\r'
# imprimir la matriu de confusio i l'accuracy de la Xarxa Neural
ntest = (np.sum(confMat))
print '\n Confusion Matrix of %2.0f elements: \n' % (ntest), confMat
print '\n Accuracy = %2.3f' % (sum(diag(confMat))/sum(confMat.flatten()))