-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy patherror_bar.py
106 lines (89 loc) · 2.78 KB
/
error_bar.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
import sys
import numpy as np
from tensorflow.keras.callbacks import ModelCheckpoint, EarlyStopping
from tensorflow.keras.models import Model
from tensorflow.keras.layers import (
Input,
Dense,
Dropout,
Conv1D,
Flatten,
Lambda,
Permute,
Multiply,
)
import tensorflow.keras.backend as K
import tensorflow as tf
from activations import Mish
from optimizers import Ranger
import losses as l
import callbacks as cb
from layers import Attention, LayerNormalization
from data import dataset
from generator import generator
strategy = tf.distribute.MirroredStrategy()
data = dataset("data/ninaPro")
reps = np.unique(data.repetition)
test_reps = [int(sys.argv[-1])]
train_reps = reps[np.where(np.isin(reps, test_reps, invert=True))]
train = generator(data, list(train_reps))
test = generator(data, test_reps, augment=False)
n_time = train[0][0].shape[1]
n_class = 53
n_features = train[0][0].shape[-1]
model_pars = {
"n_time": n_time,
"n_class": n_class,
"n_features": n_features,
"dense": [500, 500, 2000],
"drop": [0.36, 0.36, 0.36],
}
def build(model_fn):
cosine = cb.CosineAnnealingScheduler(
T_max=50, eta_max=1e-3, eta_min=1e-5, verbose=1, epoch_start=5
)
loss = l.focal_loss(gamma=3., alpha=6.)
with strategy.scope():
model = model_fn(**model_pars)
model.compile(Ranger(learning_rate=1e-3), loss=loss, metrics=["accuracy"])
print(model.summary())
return model, cosine
def attention_simple(inputs, n_time):
input_dim = int(inputs.shape[-1])
a = Permute((2, 1), name='temporalize')(inputs)
a = Dense(n_time, activation='softmax', name='attention_probs')(a)
a_probs = Permute((2, 1), name='attention_vec')(a)
output_attention_mul = Multiply(name='focused_attention')([inputs, a_probs])
output_flat = Lambda(lambda x: K.sum(x, axis=1), name='temporal_average')(output_attention_mul)
return output_flat, a_probs
def base_model(n_time, n_class, n_features, dense=[50, 50, 50], drop=[0.2, 0.2, 0.2]):
inputs = Input((n_time, n_features))
x = inputs
x = Conv1D(filters=128, kernel_size=3, padding="same", activation=Mish())(x)
x = LayerNormalization()(x)
x, a = attention_simple(x, n_time)
for d, dr in zip(dense, drop):
x = Dropout(dr)(x)
x = Dense(d, activation=Mish())(x)
x = LayerNormalization()(x)
outputs = Dense(n_class, activation="softmax")(x)
model = Model(inputs, outputs)
return model
i = sys.argv[-1]
model, cosine = build(base_model)
results = {}
model.fit(
train,
epochs=55,
callbacks=[
ModelCheckpoint(
f"h5/cv_error_bar/{i}.h5",
keep_best_only=True,
save_weights_only=True,
),
cosine,
],
use_multiprocessing=True,
workers=8,
shuffle = False,
)