-
Notifications
You must be signed in to change notification settings - Fork 15
/
Copy pathutils.py
119 lines (97 loc) · 3.78 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
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
import os
import pandas as pd
import numpy as np
def accuracy(outputs, targets, topk=(1,)):
# compute the topk accuracy
maxk = max(topk)
batch_size = targets.size(0)
_, pred = outputs.topk(maxk, 1, True, True) # return the topk scores in every input
pred = pred.t() # shape:(maxk,N)
correct = pred.eq(targets.view(1, -1).expand_as(pred))
res = []
for k in topk:
correct_k = correct[:k].view(-1).float().sum(0)
res.append(correct_k.mul_(100.0 / batch_size))
return res
def class_accuracy(outputs, targets, num_classes, topk=(1,), ):
maxk = max(topk)
batch_size = targets.size(0)
_, pred = outputs.topk(maxk, 1, True, True) # return the topk scores in every input
pred = pred.t() # shape:(maxk,N)
correct = pred.eq(targets.view(1, -1).expand_as(pred))
res = []
acc = []
class_num = np.array([0] * num_classes)
for i in targets:
class_num[i] += 1
for k in topk:
class_acc = np.array([0] * num_classes)
correct_k = correct[:k].view(-1).float().sum(0)
res.append(correct_k.mul_(100.0 / batch_size))
correct_k = correct[:k].sum(dim=0).cpu().numpy()
index=targets.cpu().numpy()[correct_k > 0]
for i in index:
class_acc[i] += 1
acc.append(class_acc)
return res, acc, class_num
class AverageMeter(object):
"""Computes and stores the average and current value"""
def __init__(self):
self.reset()
def reset(self):
self.val = 0
self.avg = 0
self.sum = 0
self.count = 0
def update(self, val, n=1):
self.val = val
self.sum += val * n
self.count += n
self.avg = self.sum / self.count
def record_info(info, filename, mode):
if mode == 'train':
result = (
'Batch Time {batch_time} '
'Epoch Time {epoch_time} '
'Data {data_time} \n'
'Loss {loss} '
'Prec@1 {top1} '
'Prec@5 {top5}\n'
'LR {lr}\n'.format(batch_time=info['Batch Time'], epoch_time=info['Epoch Time'],
data_time=info['Data Time'], loss=info['Loss'],
top1=info['Prec@1'], top5=info['Prec@5'], lr=info['lr']))
print(result)
df = pd.DataFrame.from_dict(info)
column_names = ['Epoch', 'Batch Time', 'Data Time', 'Loss', 'Prec@1', 'Prec@5', 'lr']
if mode == 'test':
result = (
'Batch Time {batch_time} '
'Epoch Time {epoch_time} \n'
'Loss {loss} '
'Prec@1 {top1} '
'Prec@5 {top5} \n'.format(batch_time=info['Batch Time'], epoch_time=info['Epoch Time'],
loss=info['Loss'], top1=info['Prec@1'], top5=info['Prec@5']))
print(result)
df = pd.DataFrame.from_dict(info)
column_names = ['Epoch', 'Batch Time', 'Epoch Time', 'Loss', 'Prec@1', 'Prec@5']
if not os.path.isfile(filename):
df.to_csv(filename, index=False, columns=column_names)
else: # else it exists so append without writing the header
df.to_csv(filename, mode='a', header=False, index=False, columns=column_names)
def adjust_learning_rate(lr, optimizer):
lr *= 0.2
for param_group in optimizer.param_groups:
param_group['lr'] = lr * param_group['lr_mult']
return lr
def read_class_name(path):
dict={}
with open(path) as f:
lines = f.read().splitlines()
for i, line in enumerate(lines):
num, name = line.split()
dict[num]=name
return dict
def index2name(index,path):
dict=read_class_name(path)
name=[dict[str(i+1)] for i in index]
return name