-
Notifications
You must be signed in to change notification settings - Fork 4
/
utils.py
70 lines (51 loc) · 1.91 KB
/
utils.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
import os
import numpy as np
import tensorflow as tf
from sklearn.metrics import confusion_matrix
def shuffle(x, y, seed):
np.random.seed(seed)
np.random.shuffle(x)
np.random.seed(seed)
np.random.shuffle(y)
return x, y
def create_dir(d):
if not tf.gfile.IsDirectory(d):
tf.gfile.MakeDirs(d)
class File(tf.gfile.GFile):
def __init__(self, *args):
super(File, self).__init__(*args)
def seek(self, position, whence=0):
if whence == 1:
position += self.tell()
elif whence == 2:
position += self.size()
else:
assert whence == 0
super(File, self).seek(position)
def o_gfile(filename, mode):
if isinstance(filename, tuple) or isinstance(filename, list):
filename = os.path.join(*filename)
return File(filename, mode)
def get_batch_size(inputs):
return tf.cast(tf.shape(inputs)[0], tf.float32)
def get_test_metrics(y_true, y_pred, verbose=True):
"""
:return: asca, pre, rec, spe, f1_ma, f1_mi, g_ma, g_mi
"""
y_true, y_pred = y_true.astype(np.int8), y_pred.astype(np.int8)
cnf_matrix = confusion_matrix(y_true, y_pred)
if verbose:
print(cnf_matrix)
FP = cnf_matrix.sum(axis=0) - np.diag(cnf_matrix)
FN = cnf_matrix.sum(axis=1) - np.diag(cnf_matrix)
TP = np.diag(cnf_matrix)
TN = cnf_matrix.sum() - (FP + FN + TP)
cs_accuracy = TP / cnf_matrix.sum(axis=1)
precision = TP / (TP + FP)
recall = TP / (TP + FN)
specificity = TN / (FP + TN)
f1_macro = (2 * precision * recall / (precision + recall)).mean()
f1_micro = 2 * TP.sum() / (2 * TP.sum() + FP.sum() + FN.sum())
g_marco = ((recall * specificity) ** 0.5).mean()
g_micro = ((TP.sum() / (TP.sum() + FN.sum())) * (TN.sum() / (TN.sum() + FP.sum()))) ** 0.5
return cs_accuracy.mean(), precision.mean(), recall.mean(), specificity.mean(), f1_macro, f1_micro, g_marco, g_micro