Exemple #1
0
def valid(sess, model):
    total_data = dataManager.train(True)
    acc_array = np.zeros((2), dtype=np.float32)
    count, total_loss, cnt = 0, 0., 0
    document, candidates, ori_labels, ori_locs = [], [], [], []

    acc_blank = np.zeros((2, 2), dtype=np.float32)

    for doc, can, lab, loc, _ in total_data:
        document.append(doc)
        candidates.append(can)
        ori_labels.append(lab)
        ori_locs.append(loc)
        cnt += 1

        if cnt == FLAGS.batch_size * 2:
            document, doc_length, candidates, labels, locs, ori_labels, mask = \
                prepare_batch_data(document, candidates, ori_labels, ori_locs)

            valid_result = model.train_step(sess, document, doc_length,
                                            candidates, labels, locs, mask,
                                            'dev')
            count += 1
            total_loss += valid_result[0]
            caculate_result = caculate_acc(ori_labels, valid_result[1])
            acc_array += caculate_result[0]
            acc_blank += caculate_result[1]

            document, candidates, ori_labels, ori_locs = [], [], [], []
            cnt = 0

    if cnt > 0:
        document, doc_length, candidates, labels, locs, ori_labels, mask = \
            prepare_batch_data(document, candidates, ori_labels, ori_locs)

        valid_result = model.train_step(sess, document, doc_length, candidates,
                                        labels, locs, mask, 'dev')
        count += 1
        total_loss += valid_result[0]
        caculate_result = caculate_acc(ori_labels, valid_result[1])
        acc_array += caculate_result[0]
        acc_blank += caculate_result[1]
        print(caculate_result)

    print(acc_array[0])
    print(acc_array[1])
    acc = acc_array[0] / acc_array[1]
    acc_single = acc_blank[0, 0] / (acc_blank[0, 1] + 1e-12)
    acc_multi = acc_blank[1, 0] / (acc_blank[1, 1] + 1e-12)

    avg_loss = total_loss / count

    print("*** Valid" +
          "  acc %.5f  loss %.3f  single_acc %.5f  multi_acc %.5f" %
          (acc, avg_loss, acc_single, acc_multi))

    return acc, avg_loss
Exemple #2
0
def train(sess, model):
    acc_array = np.zeros((2), dtype=np.float32)
    st_time, count, total_loss, cnt = time.time(), 0, 0., 0

    if tf.train.get_checkpoint_state(train_dir):
        best_dev_acc = valid(sess, model)[0]
        best_iter = model.global_step.eval()
    else:
        best_dev_acc = 0.1
    prev_loss = [1e15, 1e15]

    document, candidates, ori_labels, ori_locs = [], [], [], []
    for _ in range(10):
        total_data = dataManager.train()

        for doc, can, lab, loc, _ in total_data:
            document.append(doc)
            candidates.append(can)
            ori_labels.append(lab)
            ori_locs.append(loc)
            cnt += 1

            if cnt == FLAGS.batch_size:
                document, doc_length, candidates, labels, locs, ori_labels, mask = \
                    prepare_batch_data(document, candidates, ori_labels, ori_locs)

                train_result = model.train_step(sess, document, doc_length,
                                                candidates, labels, locs, mask)
                total_loss += train_result[0]
                acc_array += caculate_acc(ori_labels, train_result[1])[0]
                count += 1

                if model.global_step.eval() % 100 == 0:
                    temp_avg_time = (time.time() - st_time) / count
                    temp_avg_loss = total_loss / count
                    acc = acc_array[0] / acc_array[1]
                    record_str = "step %d  lr %.6f  acc %.4f  time %.3f  loss %.3f" % \
                                 (model.global_step.eval(), model.lr.eval(), acc, temp_avg_time, temp_avg_loss)
                    print(record_str)

                    if model.global_step.eval() % 1000 == 0:
                        dev_acc, dev_loss = valid(sess, model)
                        if dev_acc > best_dev_acc:
                            model.saver.save(sess,
                                             "%s/checkpoint" % train_dir,
                                             global_step=model.global_step)
                            best_dev_acc = dev_acc
                            best_iter = model.global_step.eval()
                            print("**  New best iteration  %d" % best_iter)
                        print("*   Best iteration  %d" % best_iter)

                        if dev_loss > max(prev_loss):
                            sess.run(model.lr_decay)
                        prev_loss = [prev_loss[1], dev_loss]

                    acc_array = np.zeros((2), dtype=np.float32)
                    st_time, count, total_loss = time.time(), 0, 0.

                document, candidates, ori_labels, ori_locs = [], [], [], []
                cnt = 0
Exemple #3
0
def valid(sess, model, mode="dev", record=False):
    if record:
        file = open("pred_result_" + FLAGS.model + "_" + mode + ".txt", "w")

    total_data = dataManager.valid(mode)
    acc_array = np.zeros((2), dtype=np.float32)
    count, total_loss, cnt = 0, 0., 0
    document, candidates, ori_labels, ori_locs = [], [], [], []

    acc_blank = np.zeros((2, 2), dtype=np.float32)

    for doc, can, lab, loc in total_data:
        document.append(doc)
        candidates.append(can)
        ori_labels.append(lab)
        ori_locs.append(loc)
        cnt += 1

        if cnt == FLAGS.batch_size * 2:
            document, doc_length, candidates, labels, locs, ori_labels, mask = \
                prepare_batch_data(document, candidates, ori_labels, ori_locs)

            valid_result = model.train_step(sess, document, doc_length,
                                            candidates, labels, locs, False,
                                            mask)
            count += 1
            total_loss += valid_result[0]
            caculate_result = caculate_acc(ori_labels, valid_result[1])
            acc_array += caculate_result[0]
            acc_blank += caculate_result[1]

            if record:
                for id in range(len(ori_labels)):
                    ori_label = ori_labels[id]
                    pred_result = valid_result[1][id]

                    for pred in pred_result[:len(ori_label)]:
                        file.write(str(int(pred)) + " ")
                    file.write("\n")

            document, candidates, ori_labels, ori_locs = [], [], [], []
            cnt = 0

    if cnt > 0:
        document, doc_length, candidates, labels, locs, ori_labels, mask = \
            prepare_batch_data(document, candidates, ori_labels, ori_locs)

        valid_result = model.train_step(sess, document, doc_length, candidates,
                                        labels, locs, False, mask)
        count += 1
        total_loss += valid_result[0]
        caculate_result = caculate_acc(ori_labels, valid_result[1])
        acc_array += caculate_result[0]
        acc_blank += caculate_result[1]

        if record:
            for id in range(len(ori_labels)):
                ori_label = ori_labels[id]
                pred_result = valid_result[1][id]

                for pred in pred_result[:len(ori_label)]:
                    file.write(str(int(pred)) + " ")
                file.write("\n")

    if record:
        file.close()

    acc = acc_array[0] / acc_array[1]
    acc_single = acc_blank[0, 0] / (acc_blank[0, 1] + 1e-12)
    acc_multi = acc_blank[1, 0] / (acc_blank[1, 1] + 1e-12)

    avg_loss = total_loss / count

    print("*** " + mode.upper() +
          "  acc %.5f  loss %.3f  single_acc %.5f  multi_acc %.5f" %
          (acc, avg_loss, acc_single, acc_multi))

    return acc, avg_loss