a b/code/models.py
1
from keras import optimizers, losses, activations, models
2
from keras.layers import Dense, Input, Dropout, Convolution1D, MaxPool1D, GlobalMaxPool1D, GlobalAveragePooling1D, \
3
    concatenate, SpatialDropout1D, TimeDistributed, Bidirectional, LSTM
4
from keras_contrib.layers import CRF
5
6
from utils import WINDOW_SIZE
7
8
def get_model():
9
    nclass = 5
10
    inp = Input(shape=(3000, 1))
11
    img_1 = Convolution1D(16, kernel_size=5, activation=activations.relu, padding="valid")(inp)
12
    img_1 = Convolution1D(16, kernel_size=5, activation=activations.relu, padding="valid")(img_1)
13
    img_1 = MaxPool1D(pool_size=2)(img_1)
14
    img_1 = SpatialDropout1D(rate=0.01)(img_1)
15
    img_1 = Convolution1D(32, kernel_size=3, activation=activations.relu, padding="valid")(img_1)
16
    img_1 = Convolution1D(32, kernel_size=3, activation=activations.relu, padding="valid")(img_1)
17
    img_1 = MaxPool1D(pool_size=2)(img_1)
18
    img_1 = SpatialDropout1D(rate=0.01)(img_1)
19
    img_1 = Convolution1D(32, kernel_size=3, activation=activations.relu, padding="valid")(img_1)
20
    img_1 = Convolution1D(32, kernel_size=3, activation=activations.relu, padding="valid")(img_1)
21
    img_1 = MaxPool1D(pool_size=2)(img_1)
22
    img_1 = SpatialDropout1D(rate=0.01)(img_1)
23
    img_1 = Convolution1D(256, kernel_size=3, activation=activations.relu, padding="valid")(img_1)
24
    img_1 = Convolution1D(256, kernel_size=3, activation=activations.relu, padding="valid")(img_1)
25
    img_1 = GlobalMaxPool1D()(img_1)
26
    img_1 = Dropout(rate=0.01)(img_1)
27
28
    dense_1 = Dropout(rate=0.01)(Dense(64, activation=activations.relu, name="dense_1")(img_1))
29
    dense_1 = Dropout(rate=0.05)(Dense(64, activation=activations.relu, name="dense_2")(dense_1))
30
    dense_1 = Dense(nclass, activation=activations.softmax, name="dense_3")(dense_1)
31
32
    model = models.Model(inputs=inp, outputs=dense_1)
33
    opt = optimizers.Adam(0.001)
34
35
    model.compile(optimizer=opt, loss=losses.sparse_categorical_crossentropy, metrics=['acc'])
36
    model.summary()
37
    return model
38
39
def get_base_model():
40
    inp = Input(shape=(3000, 1))
41
    img_1 = Convolution1D(16, kernel_size=5, activation=activations.relu, padding="valid")(inp)
42
    img_1 = Convolution1D(16, kernel_size=5, activation=activations.relu, padding="valid")(img_1)
43
    img_1 = MaxPool1D(pool_size=2)(img_1)
44
    img_1 = SpatialDropout1D(rate=0.01)(img_1)
45
    img_1 = Convolution1D(32, kernel_size=3, activation=activations.relu, padding="valid")(img_1)
46
    img_1 = Convolution1D(32, kernel_size=3, activation=activations.relu, padding="valid")(img_1)
47
    img_1 = MaxPool1D(pool_size=2)(img_1)
48
    img_1 = SpatialDropout1D(rate=0.01)(img_1)
49
    img_1 = Convolution1D(32, kernel_size=3, activation=activations.relu, padding="valid")(img_1)
50
    img_1 = Convolution1D(32, kernel_size=3, activation=activations.relu, padding="valid")(img_1)
51
    img_1 = MaxPool1D(pool_size=2)(img_1)
52
    img_1 = SpatialDropout1D(rate=0.01)(img_1)
53
    img_1 = Convolution1D(256, kernel_size=3, activation=activations.relu, padding="valid")(img_1)
54
    img_1 = Convolution1D(256, kernel_size=3, activation=activations.relu, padding="valid")(img_1)
55
    img_1 = GlobalMaxPool1D()(img_1)
56
    img_1 = Dropout(rate=0.01)(img_1)
57
58
    dense_1 = Dropout(0.01)(Dense(64, activation=activations.relu, name="dense_1")(img_1))
59
60
    base_model = models.Model(inputs=inp, outputs=dense_1)
61
    opt = optimizers.Adam(0.001)
62
63
    base_model.compile(optimizer=opt, loss=losses.sparse_categorical_crossentropy, metrics=['acc'])
64
    #model.summary()
65
    return base_model
66
67
68
def get_model_cnn():
69
    nclass = 5
70
71
    seq_input = Input(shape=(None, 3000, 1))
72
    base_model = get_base_model()
73
    # for layer in base_model.layers:
74
    #     layer.trainable = False
75
    encoded_sequence = TimeDistributed(base_model)(seq_input)
76
    encoded_sequence = SpatialDropout1D(rate=0.01)(Convolution1D(128,
77
                                                               kernel_size=3,
78
                                                               activation="relu",
79
                                                               padding="same")(encoded_sequence))
80
    encoded_sequence = Dropout(rate=0.05)(Convolution1D(128,
81
                                                               kernel_size=3,
82
                                                               activation="relu",
83
                                                               padding="same")(encoded_sequence))
84
85
    #out = TimeDistributed(Dense(nclass, activation="softmax"))(encoded_sequence)
86
    out = Convolution1D(nclass, kernel_size=3, activation="softmax", padding="same")(encoded_sequence)
87
88
    model = models.Model(seq_input, out)
89
90
    model.compile(optimizers.Adam(0.001), losses.sparse_categorical_crossentropy, metrics=['acc'])
91
    model.summary()
92
93
    return model
94
95
def get_model_lstm():
96
    nclass = 5
97
98
    seq_input = Input(shape=(None, 3000, 1))
99
    base_model = get_base_model()
100
    for layer in base_model.layers:
101
        layer.trainable = False
102
    encoded_sequence = TimeDistributed(base_model)(seq_input)
103
    encoded_sequence = Bidirectional(LSTM(100, return_sequences=True))(encoded_sequence)
104
    encoded_sequence = Dropout(rate=0.5)(encoded_sequence)
105
    encoded_sequence = Bidirectional(LSTM(100, return_sequences=True))(encoded_sequence)
106
    #out = TimeDistributed(Dense(nclass, activation="softmax"))(encoded_sequence)
107
    out = Convolution1D(nclass, kernel_size=1, activation="softmax", padding="same")(encoded_sequence)
108
109
    model = models.Model(seq_input, out)
110
111
    model.compile(optimizers.Adam(0.001), losses.sparse_categorical_crossentropy, metrics=['acc'])
112
    model.summary()
113
114
    return model
115
116
def get_model_cnn_crf(lr=0.001):
117
    nclass = 5
118
119
    seq_input = Input(shape=(None, 3000, 1))
120
    base_model = get_base_model()
121
    # for layer in base_model.layers:
122
    #     layer.trainable = False
123
    encoded_sequence = TimeDistributed(base_model)(seq_input)
124
    encoded_sequence = SpatialDropout1D(rate=0.01)(Convolution1D(128,
125
                                                               kernel_size=3,
126
                                                               activation="relu",
127
                                                               padding="same")(encoded_sequence))
128
    encoded_sequence = Dropout(rate=0.05)(Convolution1D(128,
129
                                                               kernel_size=3,
130
                                                               activation="linear",
131
                                                               padding="same")(encoded_sequence))
132
133
    #out = TimeDistributed(Dense(nclass, activation="softmax"))(encoded_sequence)
134
    # out = Convolution1D(nclass, kernel_size=3, activation="linear", padding="same")(encoded_sequence)
135
136
    crf = CRF(nclass, sparse_target=True)
137
138
    out = crf(encoded_sequence)
139
140
141
    model = models.Model(seq_input, out)
142
143
    model.compile(optimizers.Adam(lr), crf.loss_function, metrics=[crf.accuracy])
144
    model.summary()
145
146
    return model