-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathlearn_utils.py
127 lines (108 loc) · 3.66 KB
/
learn_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
120
121
122
123
124
125
126
127
'''Some helper functions for PyTorch, including:
- get_mean_and_std: calculate the mean and std value of dataset.
- msr_init: net parameter initialization.
- progress_bar: progress bar mimic xlua.progress.
'''
import random
import numpy as np
import progressbar
import torch
import torch.nn as nn
import torch.nn.init as init
def get_mean_and_std(dataset):
'''Compute the mean and std value of dataset.'''
dataloader = torch.utils.data.DataLoader(dataset, batch_size=1, shuffle=True, num_workers=2)
mean = torch.zeros(3)
std = torch.zeros(3)
print('==> Computing mean and std..')
for inputs, targets in dataloader:
for i in range(3):
mean[i] += inputs[:,i,:,:].mean()
std[i] += inputs[:,i,:,:].std()
mean.div_(len(dataset))
std.div_(len(dataset))
return mean, std
def init_params(net):
'''Init layer parameters.'''
for m in net.modules():
if isinstance(m, nn.Conv2d):
init.kaiming_normal(m.weight, mode='fan_out')
if m.bias:
init.constant(m.bias, 0)
elif isinstance(m, nn.BatchNorm2d):
init.constant(m.weight, 1)
init.constant(m.bias, 0)
elif isinstance(m, nn.Linear):
init.normal(m.weight, std=1e-3)
if m.bias:
init.constant(m.bias, 0)
def get_progress_bar(total):
format_custom_text = progressbar.FormatCustomText(
'Loss: %(loss).3f | Acc: %(acc).3f%% (%(c)d/%(t)d)',
dict(
loss=0,
acc=0,
c=0,
t=0,
),
)
prog_bar = progressbar.ProgressBar(0, total, widgets=[
progressbar.Counter(), ' of {} '.format(total),
progressbar.Bar(),
' ', progressbar.ETA(),
' ', format_custom_text
])
return prog_bar, format_custom_text
def update_progress_bar(progress_bar_obj, index=None, loss=None, acc=None, c=None, t=None):
prog_bar, format_custom_text = progress_bar_obj
format_custom_text.update_mapping(loss=loss, acc=acc, c=c, t=t)
prog_bar.update(index)
def format_time(seconds):
days = int(seconds / 3600/24)
seconds = seconds - days*3600*24
hours = int(seconds / 3600)
seconds = seconds - hours*3600
minutes = int(seconds / 60)
seconds = seconds - minutes*60
secondsf = int(seconds)
seconds = seconds - secondsf
millis = int(seconds*1000)
f = ''
i = 1
if days > 0:
f += str(days) + 'D'
i += 1
if hours > 0 and i <= 2:
f += str(hours) + 'h'
i += 1
if minutes > 0 and i <= 2:
f += str(minutes) + 'm'
i += 1
if secondsf > 0 and i <= 2:
f += str(secondsf) + 's'
i += 1
if millis > 0 and i <= 2:
f += str(millis) + 'ms'
i += 1
if f == '':
f = '0ms'
return f
def reset_seed(seed):
"""
Sets seed of all random number generators used to the same seed, given as argument
WARNING: for full reproducibility of training, torch.backends.cudnn.deterministic = True is also needed!
"""
torch.manual_seed(seed)
random.seed(seed)
np.random.seed(seed)
def begin_chart(chart_name, x_axis_name):
print(f'{{"chart":"{chart_name}", "axis": "{x_axis_name}"}}')
def begin_per_epoch_chart(chart_name):
begin_chart(chart_name, 'Epoch')
def add_chart_point(chart_name, x, y):
print(f'{{"chart": "{chart_name}", "x":{x}, "y":{y}}}')
def compute_weights_l1_norm(model):
norm_sum = 0
for param in model.parameters():
norm_sum += torch.sum(torch.abs(param))
return norm_sum