-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathmodelling.py
108 lines (86 loc) · 4.15 KB
/
modelling.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
from tensorflow.keras.optimizers import SGD
from tensorflow.keras import Sequential
from tensorflow.keras.layers import Input, Conv1D, Flatten, MaxPooling1D, Dense, concatenate
from tensorflow.keras.regularizers import L2
from tensorflow.keras.models import Model
def exponential_decay_fn(epoch):
return 0.01*0.1**(epoch/300)
def create_single_stream_cnn_model(input_shape):
model = Sequential([
Conv1D(64, 3, activation='relu', padding='same', input_shape=input_shape), #TODO: Look into input_shape
Conv1D(64, 3, activation='relu', padding='same'),
MaxPooling1D(3, strides=3),
Conv1D(128, 3, activation='relu', padding='same'),
Conv1D(128, 3, activation='relu', padding='same'),
MaxPooling1D(3, strides=3),
Conv1D(256, 3, activation='relu', padding='same'),
Conv1D(256, 3, activation='relu', padding='same'),
MaxPooling1D(2, strides=2),
Conv1D(512, 3, activation='relu', padding='same'),
Conv1D(512, 3, activation='relu', padding='same'),
MaxPooling1D(2, strides=2),
Conv1D(512, 3, activation='relu', padding='same'),
Conv1D(512, 3, activation='relu', padding='same'),
MaxPooling1D(2, strides=2),
Flatten(),
Dense(1024, activation='relu', kernel_regularizer=L2(0.0001)),
Dense(1024, activation='relu', kernel_regularizer=L2(0.0001)),
Dense(256, activation='relu', kernel_regularizer=L2(0.0001)),
Dense(1, activation='sigmoid')
])
optimizer = SGD()
metrics = ['accuracy', 'Precision', 'Recall']
model.compile(loss='binary_crossentropy', optimizer=optimizer, metrics=metrics)
print(model.summary())
return model
def create_dual_stream_cnn_model(input_shape, stream2_size = 3, verbose = 1):
'''
Creates a CNN model following the paper
'''
# Define the inputs for each stream
input = Input(shape=input_shape)
# Stream 1
x = Conv1D(64, 3, activation='relu', padding='same')(input)
x = Conv1D(64, 3, activation='relu', padding='same')(x)
x = MaxPooling1D(3, strides=3)(x)
x = Conv1D(128, 3, activation='relu', padding='same')(x)
x = Conv1D(128, 3, activation='relu', padding='same')(x)
x = MaxPooling1D(3, strides=3)(x)
x = Conv1D(256, 3, activation='relu', padding='same')(x)
x = Conv1D(256, 3, activation='relu', padding='same')(x)
x = MaxPooling1D(2, strides=2)(x)
x = Conv1D(512, 3, activation='relu', padding='same')(x)
x = Conv1D(512, 3, activation='relu', padding='same')(x)
x = MaxPooling1D(2, strides=2)(x)
x = Conv1D(512, 3, activation='relu', padding='same')(x)
x = Conv1D(512, 3, activation='relu', padding='same')(x)
x = MaxPooling1D(2, strides=2)(x)
# Stream 2
y = Conv1D(64, stream2_size, activation='relu', padding='same')(input)
y = Conv1D(64, stream2_size, activation='relu', padding='same')(y)
y = MaxPooling1D(3, strides=3)(y)
y = Conv1D(128, stream2_size, activation='relu', padding='same')(y)
y = Conv1D(128, stream2_size, activation='relu', padding='same')(y)
y = MaxPooling1D(3, strides=3)(y)
y = Conv1D(256, 3, activation='relu', padding='same')(y)
y = Conv1D(256, 3, activation='relu', padding='same')(y)
y = MaxPooling1D(2, strides=2)(y)
y = Conv1D(512, 3, activation='relu', padding='same')(y)
y = Conv1D(512, 3, activation='relu', padding='same')(y)
y = MaxPooling1D(2, strides=2)(y)
y = Conv1D(512, 3, activation='relu', padding='same')(y)
y = Conv1D(512, 3, activation='relu', padding='same')(y)
y = MaxPooling1D(2, strides=2)(y)
concatenated = concatenate([x, y])
z = Flatten()(concatenated)
z = Dense(1024, activation='relu', kernel_regularizer=L2(0.0001))(z)
z = Dense(1024, activation='relu', kernel_regularizer=L2(0.0001))(z)
z = Dense(256, activation='relu', kernel_regularizer=L2(0.0001))(z)
z = Dense(1, activation='sigmoid')(z)
model = Model(inputs=input, outputs=z)
optimizer = SGD()
metrics = ['accuracy', 'Precision', 'Recall']
model.compile(loss='binary_crossentropy', optimizer=optimizer, metrics=metrics)
if verbose > 0:
print(model.summary())
return model