def __init__(self, filters=200, dyn_out_len=100, name: str = ''): ## PARAMETERS # Embeddings # vocab_size = 4092 entity_vocab_size = 20 pos_vocab_size = 20 # word_emb_dim = 50 entity_emb_dim = 10 pos_emb_dim = 10 # Conv1D # filters = 20 conv_kernel_size = 1 conv_strides = 1 # Pooling # dyn_out_len = 10 self.parameters = (name, entity_vocab_size, pos_vocab_size, entity_emb_dim, pos_emb_dim, filters, conv_kernel_size, conv_strides, dyn_out_len) ## LAYERS # Input tokens = Input(batch_shape=(1, None, 51)) relpos1 = Input(batch_shape=(1, None, 1)) relpos2 = Input(batch_shape=(1, None, 1)) entity = Input(batch_shape=(1, None)) pos = Input(batch_shape=(1, None)) lemma = Input(batch_shape=(1, None, 51)) # Embedding # word_emb = Embedding(vocab_size, word_emb_dim)(tokens) entity_emb = Embedding(entity_vocab_size, entity_emb_dim)(entity) pos_emb = Embedding(pos_vocab_size, pos_emb_dim)(pos) # lemma_emb = Embedding(vocab_size, word_emb_dim)(lemma) # Base-model # x = concatenate([word_emb, relpos1, relpos2, entity_emb, pos_emb, lemma_emb], axis=2) x = Concatenate(axis=2)( [tokens, relpos1, relpos2, entity_emb, pos_emb, lemma]) x = Dropout(0.5)(x) x = Conv1D(filters=filters, kernel_size=conv_kernel_size, strides=conv_strides, activation='relu')(x) x = Dynamic_max_pooling(filters, dyn_out_len)(x) x = Flatten()(x) x = Dropout(0.5)(x) x = Dense(4, activation='softmax')( x) # 4 == n_classes in data (i.e. NOT a parameter) ## Create model model = Model(inputs=[tokens, relpos1, relpos2, entity, pos, lemma], outputs=x) # model.summary() model.compile( loss= categorical_crossentropy, # for onehot, for idx: sparse_categorical_crossentropy optimizer='adam', metrics=['accuracy']) self.model = model self.base_dir = os.path.join( os.getcwd(), 'Extra_files/resources/', self.__class__.__name__ + '_' + str(filters) + '_' + str(dyn_out_len)) os.makedirs(self.base_dir, exist_ok=True) dir_ = self.base_dir names = [x for x in os.listdir(dir_)] names.sort(key=lambda x: int(x.split('_')[0])) h = hash(self.parameters) dir_set = False num = 0 for x in names: num, hash_ = x.split('_') if h == int(hash_): dir_ = os.path.join(dir_, x) dir_set = True break if not dir_set: dir_ = os.path.join(dir_, str(int(num) + 1) + '_' + str(h)) # print('saving to: {}'.format(dir_)) self.final_dir = dir_ os.makedirs(self.final_dir, exist_ok=True)