forked from karpathy/convnetjs
-
Notifications
You must be signed in to change notification settings - Fork 0
/
util.go
71 lines (60 loc) · 1.2 KB
/
util.go
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
// Package cnnutil contains various utility functions.
package cnnutil
// Window stores _size_ number of values
// and returns averages. Useful for keeping running
// track of validation or training accuracy during SGD
type Window struct {
v []float64
index int
size int
minsize int
}
func NewWindow(size, minsize int) *Window {
return &Window{
v: make([]float64, 0, size),
size: size,
minsize: minsize,
}
}
func (w *Window) Add(x float64) {
if len(w.v) < w.size {
w.v = append(w.v, x)
} else {
w.v[w.index] = x
w.index++
if w.index >= w.size {
w.index = 0
}
}
}
func (w *Window) Average() float64 {
if len(w.v) < w.minsize {
return -1
}
sum := 0.0
for _, f := range w.v {
sum += f
}
return sum / float64(len(w.v))
}
func (w *Window) Reset() {
w.v = w.v[:0]
w.index = 0
}
// returns min, max and indices of an array
func MaxMin(w []float64) (maxi int, maxv float64, mini int, minv, dv float64) {
if len(w) == 0 {
return // ... ;s
}
maxv, minv = w[0], w[0]
maxi, mini = 0, 0
for i := 1; i < len(w); i++ {
if w[i] > maxv {
maxv, maxi = w[i], i
}
if w[i] < minv {
minv, mini = w[i], i
}
}
return maxi, maxv, mini, minv, maxv - minv
}