Esempio n. 1
0
def compute_confuse_matrix(fname, classes):
    """
    Give a file, compute confuse matrix of y_true and y_pred.
    """
    print('im in')
    y_true = []
    with codecs.open(fname, 'r', 'utf8') as f:
        for line in f:
            line = line.strip().split('\t')[-1]
            y_true.append(line)

    checkpoint_dir = "output/self_attention/multi_attention_0802/"
    pred_path = "tmp/eval_y_self_attention.txt"
    if os.path.exists(checkpoint_dir + 'config.pkl'):
        config = pickle.load(open(checkpoint_dir + 'config.pkl', 'rb'))
    else:
        config = Config()

    config.mode = 'inference'

    word2id, id2word = read_vocab(config.word_vocab_file)
    tag2id, id2tag = read_vocab(config.tag_vocab_file)

    with tf.Session(config=get_config_proto(
            log_device_placement=False)) as sess:
        model = get_model(config.model, config, sess)
        model.build()
        model.restore_model(checkpoint_dir)
        y_pred = infer_file(model, word2id, id2tag, fname, pred_path)

    cmatrix = confusion_matrix(y_true, y_pred, classes)
    print(cmatrix)
    correct = [x == y for x, y in list(zip(y_true, y_pred))]
    print(correct.count(True) / len(correct))
    return cmatrix
Esempio n. 2
0
def main(_argv):
    """Program entry point.
    """
    if not FLAGS.model_dir:
        raise Exception("you must provide model directory")

    with tf.Session(config=get_config_proto(False)) as sess:
        # read config from pickle
        model_dir = Path(FLAGS.model_dir)
        config = pickle.load((model_dir / 'config.pkl').open('rb'))
        config.mode = "inference"

        model = NERModel(sess, config)
        model.build()

        # using best dev model
        best_dev_dir = model_dir / "best_dev"
        model.restore_model(best_dev_dir)

        export_path = FLAGS.export
        builder = saved_model_builder.SavedModelBuilder(export_path)
        prediction_input_tokens = utils.build_tensor_info(model.source_tokens)
        prediction_input_length = utils.build_tensor_info(model.source_length)
        prediction_input_segments = utils.build_tensor_info(model.segment_tokens)
        prediction_output_sequence = utils.build_tensor_info(model.viterbi_sequence)
        prediction_output_score = utils.build_tensor_info(model.viterbi_score)

        prediction_signature = signature_def_utils.build_signature_def(
            inputs={'query': prediction_input_tokens, 'query_length': prediction_input_length, "segement": prediction_input_segments},
            outputs={"sequence": prediction_output_sequence,"score":prediction_output_score},
            method_name=signature_constants.PREDICT_METHOD_NAME)

        legacy_init_op = tf.group(
            tf.tables_initializer(), name='legacy_init_op')
        builder.add_meta_graph_and_variables(
            sess, [tag_constants.SERVING],
            signature_def_map={
                'predict':
                prediction_signature,
                signature_constants.DEFAULT_SERVING_SIGNATURE_DEF_KEY:
                prediction_signature,
            },
            legacy_init_op=legacy_init_op,
            clear_devices=True)

        builder.save()

        print('Done exporting!')
Esempio n. 3
0
def main():
    checkpoint_dir = "output/self_attention/multi_attention_0802/"
    # inference 用的还是文件中的config,并不是当初的config了。应该读取check_point中的config.pkl
    # TODO: read config from checkpoint/config.pkl
    if os.path.exists(checkpoint_dir + 'config.pkl'):
        config = pickle.load(open(checkpoint_dir+'config.pkl', 'rb'))
    else:
        config = Config()

    config.mode = 'inference'
    
    # 每次训练word_vocab和tag_vocab都会变化,而inference的时候用的是当初训练该模型时的词表;所以最好把词表定下来。
    # TODO:data_utils::fix vocab
    word2id, id2word = read_vocab(config.word_vocab_file)
    tag2id, id2tag = read_vocab(config.tag_vocab_file)

    with tf.Session(config=get_config_proto(log_device_placement=False)) as sess:
        model = get_model(config.model, config, sess)
        model.build()
        model.restore_model(checkpoint_dir)
        infer_cmd(model, word2id, id2tag)
Esempio n. 4
0
        config = pickle.load(
            open(os.path.join(checkpoint_dir + "config.pkl"), 'rb'))
    else:
        config.checkpoint_dir = checkpoint_dir
        config.vocab_file = os.path.join(checkpoint_dir, "word.vocab")
        config.encode_cell_type = 'COUPLED_LSTM'
        #config.external_word_file = external_words_fname
        #config.pretrained_embedding_file = os.path.join(DATA_DIR,"wiki_100.utf8")
        config.num_tags = len(tag_vocab)
        config.segment_vocab_file = os.path.join(checkpoint_dir, "seg.vocab")
        config.tag_vocab_file = os.path.join(checkpoint_dir, "tag.vocab")
        pickle.dump(
            config,
            open(os.path.join(config.checkpoint_dir, "config.pkl"), 'wb'))

    with tf.Session(config=get_config_proto(
            log_device_placement=False)) as sess:
        model = NERModel(sess, config)
        model.build()
        model.init()

        print("Config:")
        for k, v in config.__dict__.items():
            print(k, '-', v, sep='\t')

        try:
            model.restore_model()
            print("restored model from checkpoint dir")
        except:
            print("create with fresh parameters")
            pass
Esempio n. 5
0
def main():
    parser = argparse.ArgumentParser()
    add_argument(parser)
    args = parser.parse_args()

    config = Config()

    train_data = read_data(config.train_data_files, config.model)
    # 试试对负样本进行降采样
    # train_data = sample(train_data)
    eval_data = read_data(config.eval_data_files, config.model)
    # train_data_sen = read_data_sen("data/data_tech.train")
    # eval_data_sen = read_data_sen("data/data_tech.eval")
    # 这里使用了预训练的词向量的词表作为了模型的词表
    create_vocab_from_pretrained_w2v(config.w2v_path, config.word_vocab_file)
    create_tag_vocab_from_data(train_data, config.tag_vocab_file)

    word2id, id2word = read_vocab(config.word_vocab_file)
    tag2id, id2tag = read_vocab(config.tag_vocab_file)

    # convert word into ids
    train_data = convert_dataset(train_data, word2id, tag2id,
                                 config.sentence_length, config.num_classes,
                                 config.model)
    # train_data_sen = convert_dataset_sen(train_data_sen, word2id, tag2id, config.num_classes, one_hot_label=True)
    print(train_data[0])
    eval_data = convert_dataset(eval_data, word2id, tag2id,
                                config.sentence_length, config.num_classes,
                                config.model)
    # eval_data_sen = convert_dataset_sen(eval_data_sen, word2id, tag2id, config.num_classes, one_hot_label=True)
    print("train_data size: {0}".format(len(train_data)))

    if os.path.exists(os.path.join(config.checkpoint_dir, "config.pkl")):
        config = pickle.load(
            open(os.path.join(config.checkpoint_dir, "config.pkl"), 'rb'))
    else:
        pickle.dump(
            config,
            open(os.path.join(config.checkpoint_dir, "config.pkl"), 'wb'))

    with tf.Session(config=get_config_proto(
            log_device_placement=False)) as sess:
        model = get_model(config.model, config, sess)
        model.build()
        model.init()

        batch_manager = Batch_self_attention(train_data, config.batch_size)
        batch_manager_eval = Batch_self_attention(eval_data, config.batch_size)
        # batch_manager = Batch(train_data, config.batch_size)
        # batch_manager_eval = Batch(eval_data, config.batch_size)
        epoches = config.epoch
        max_acc = 0
        for i in range(epoches):
            for batch in batch_manager.next_batch():
                # print(batch)
                loss, accuracy, global_step = model.train_one_step(*zip(
                    *batch))
                # key_shape, query_shape = model.test(*zip(*batch))
                # print(key_shape, query_shape)
                # break
            train_accuracy = evaluate(model, batch_manager)
            eval_accuracy = evaluate(model, batch_manager_eval)
            # train_accuracy = evaluate_attention(model, train_data_sen, id2tag)
            # eval_accuracy = evaluate_attention(model, eval_data_sen, id2tag)
            print("epoch - {0}      step - {1}      loss - {2}      train_accuracy - {3}    eval_accuracy - {4}"\
                .format(i, global_step, loss, train_accuracy, eval_accuracy))

            # train_accuracy = evaluate_attention(model, train_data_sen, id2tag)
            # eval_accuracy = evaluate_attention(model, eval_data_sen, id2tag)
            # print("epoch - {0}      step - {1}      loss - {2}      train_accuracy - {3}    eval_accuracy - {4}"\
            #         .format(i, global_step, loss, train_accuracy, eval_accuracy))

            if max_acc < eval_accuracy:
                max_acc = eval_accuracy
                model.save_model()