| from tf_keras.layers import * |
| from tf_keras.models import * |
| from tf_keras import backend as K |
| from tf_keras.layers import Layer |
| from tf_keras import initializers |
|
|
|
|
| MAX_LEN_cdr = 24
|
| NB_WORDS_cdr = 8001
|
| NB_cdr_number_ids = 3
|
|
|
| MAX_LEN_ag = 2371
|
| NB_WORDS_ag = 21
|
|
|
| EMBEDDING_DIM = 100
|
|
|
| filters = 256
|
|
|
| cdr_kernel_size = 6
|
| cdr_pool_size = cdr_strides = 4
|
|
|
| ag_kernel_size = 60
|
| ag_pool_size = ag_strides = 20
|
|
|
| lstm_size = 50
|
|
|
| att_size = 50
|
|
|
| dt_ratio = 0.5
|
|
|
| class AttLayer(Layer):
|
| def __init__(self, attention_dim):
|
| self.init = initializers.RandomNormal(seed=10)
|
| self.supports_masking = True
|
| self.attention_dim = attention_dim
|
| super(AttLayer, self).__init__()
|
|
|
| def build(self, input_shape): |
| assert len(input_shape) == 3 |
|
|
| self.W = self.add_weight( |
| name="W", |
| shape=(input_shape[-1], self.attention_dim), |
| initializer=self.init, |
| trainable=True, |
| ) |
| self.b = self.add_weight( |
| name="b", |
| shape=(self.attention_dim,), |
| initializer=self.init, |
| trainable=True, |
| ) |
| self.u = self.add_weight( |
| name="u", |
| shape=(self.attention_dim, 1), |
| initializer=self.init, |
| trainable=True, |
| ) |
|
|
| super(AttLayer, self).build(input_shape) |
|
|
| def compute_mask(self, inputs, mask=None):
|
| return mask
|
|
|
| def call(self, x, mask=None):
|
|
|
|
|
|
|
| uit = K.tanh(K.bias_add(K.dot(x, self.W), self.b))
|
| ait = K.dot(uit, self.u)
|
| ait = K.squeeze(ait, -1)
|
|
|
| ait = K.exp(ait)
|
|
|
| if mask is not None:
|
|
|
| ait *= K.cast(mask, K.floatx())
|
| ait /= K.cast(K.sum(ait, axis=1, keepdims=True) + K.epsilon(), K.floatx())
|
| ait = K.expand_dims(ait)
|
| weighted_input = x * ait
|
| output = K.sum(weighted_input, axis=1)
|
|
|
| return output
|
|
|
| def compute_output_shape(self, input_shape):
|
| return (input_shape[0], input_shape[-1])
|
|
|
|
|
| def get_model():
|
| cdrs_ids = Input(shape=(MAX_LEN_cdr,))
|
| cdrs_number_ids = Input(shape=(MAX_LEN_cdr,))
|
|
|
| ags_ids = Input(shape=(MAX_LEN_ag,))
|
|
|
| emb_cdr_ids = Embedding(NB_WORDS_cdr, EMBEDDING_DIM, trainable=True)(cdrs_ids)
|
| emb_cdr_number_ids = Embedding(NB_cdr_number_ids, EMBEDDING_DIM, trainable=True)(cdrs_number_ids)
|
| emb_cdr = Add()([emb_cdr_ids, emb_cdr_number_ids ])
|
| emb_cdr_bn = BatchNormalization()(emb_cdr)
|
| emb_cdr_dt = Dropout(dt_ratio)(emb_cdr_bn)
|
|
|
| emb_ag_ids = Embedding(NB_WORDS_ag, EMBEDDING_DIM, trainable=True)(ags_ids)
|
| emb_ag_bn = BatchNormalization()(emb_ag_ids)
|
| emb_ag_dt = Dropout(dt_ratio)(emb_ag_bn)
|
|
|
| cdr_conv_layer = Conv1D(filters = filters, kernel_size = cdr_kernel_size,padding = "valid",activation='relu')(emb_cdr_dt)
|
| cdr_max_pool_layer = MaxPooling1D(pool_size = cdr_pool_size, strides = cdr_strides)(cdr_conv_layer)
|
|
|
| ag_conv_layer = Conv1D(filters = filters, kernel_size = ag_kernel_size,padding = "valid",activation='relu')(emb_ag_dt)
|
| ag_max_pool_layer = MaxPooling1D(pool_size = ag_pool_size, strides = ag_strides)(ag_conv_layer)
|
|
|
| merge_layer=Concatenate(axis=1)([cdr_max_pool_layer, ag_max_pool_layer])
|
| bn=BatchNormalization()(merge_layer)
|
| dt=Dropout(dt_ratio)(bn)
|
|
|
| l_lstm = Bidirectional(LSTM(lstm_size, return_sequences=True))(dt)
|
| l_att = AttLayer(att_size)(l_lstm)
|
|
|
| preds = Dense(1, activation='sigmoid')(l_att)
|
|
|
| model = Model(inputs=[cdrs_ids, cdrs_number_ids, ags_ids],outputs= [preds])
|
|
|
| model.compile(loss='binary_crossentropy',optimizer='adam')
|
|
|
| return model |
|
|