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
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!')
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)
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
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()