Пример #1
0
    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)