示例#1
0
    def do_eval(sess, train_q, train_a, train_lab):
        train_correct = 0.0
        # number_examples = len(train_q)
        # print("valid examples:", number_examples)
        eval_loss, eval_accc, eval_counter = 0.0, 0.0, 0
        eval_true_positive, eval_false_positive, eval_true_negative, eval_false_negative = 0, 0, 0, 0
        # batch_size = 1
        weights_label = {}  # weight_label[label_index]=(number,correct)
        weights = np.ones((opt.batch_size))
        kf_train = get_minibatches_idx(len(train_q),
                                       opt.batch_size,
                                       shuffle=True)
        for _, train_index in kf_train:
            train_sents_1 = [train_q[t] for t in train_index]
            train_sents_2 = [train_a[t] for t in train_index]
            train_labels = [train_lab[t] for t in train_index]
            train_labels_array = np.array(train_labels)
            # print("train_labels", train_labels.shape)
            # train_labels = train_labels.reshape((len(train_labels), opt.category))
            train_labels = np.eye(opt.category)[train_labels_array]
            x_train_batch_1, x_train_mask_1 = prepare_data_for_emb(
                train_sents_1, opt)
            x_train_batch_2, x_train_mask_2 = prepare_data_for_emb(
                train_sents_2, opt)

            curr_eval_loss, curr_accc, logits = sess.run(
                [loss_, accuracy_, logits_],
                feed_dict={
                    x_1_: x_train_batch_1,
                    x_2_: x_train_batch_2,
                    x_mask_1_: x_train_mask_1,
                    x_mask_2_: x_train_mask_2,
                    y_: train_labels,
                    opt.weights_label: weights,
                    keep_prob: 1.0
                })
            true_positive, false_positive, true_negative, false_negative = compute_confuse_matrix(
                logits, train_labels
            )  # logits:[batch_size,label_size]-->logits[0]:[label_size]
            # write_predict_error_to_file(start,file_object,logits[0], evalY[start:end][0],vocabulary_index2word,evalX1[start:end],evalX2[start:end])
            eval_loss, eval_accc, eval_counter = eval_loss + curr_eval_loss, eval_accc + curr_accc, eval_counter + 1  # 注意这里计算loss和accc的方法,计算累加值,然后归一化
            weights_label = compute_labels_weights(
                weights_label, logits, train_labels_array
            )  # compute_labels_weights(weights_label,logits,labels)
            eval_true_positive, eval_false_positive = eval_true_positive + true_positive, eval_false_positive + false_positive
            eval_true_negative, eval_false_negative = eval_true_negative + true_negative, eval_false_negative + false_negative
            # weights_label = compute_labels_weights(weights_label, logits, evalY[start:end]) #compute_labels_weights(weights_label,logits,labels)
        print("true_positive:", eval_true_positive, ";false_positive:",
              eval_false_positive, ";true_negative:", eval_true_negative,
              ";false_negative:", eval_false_negative)
        p = float(eval_true_positive) / float(eval_true_positive +
                                              eval_false_positive)
        r = float(eval_true_positive) / float(eval_true_positive +
                                              eval_false_negative)
        f1_score = (2 * p * r) / (p + r)
        print("eval_counter:", eval_counter, ";eval_acc:", eval_accc)
        return eval_loss / float(eval_counter), eval_accc / float(
            eval_counter), f1_score, p, r, weights_label
示例#2
0
def do_eval(sess, textCNN, evalX1, evalX2, evalBlueScores, evalY, iteration,
            vocabulary_index2word):
    number_examples = len(evalX1)
    print("valid examples:", number_examples)
    eval_loss, eval_accc, eval_counter = 0.0, 0.0, 0
    eval_true_positive, eval_false_positive, eval_true_negative, eval_false_negative = 0, 0, 0, 0
    batch_size = 1
    weights_label = {}  # weight_label[label_index]=(number,correct)
    weights = np.ones((batch_size))
    for start, end in zip(range(0, number_examples, batch_size),
                          range(batch_size, number_examples, batch_size)):
        feed_dict = {
            textCNN.input_x1: evalX1[start:end],
            textCNN.input_x2: evalX2[start:end],
            textCNN.input_bluescores: evalBlueScores[start:end],
            textCNN.input_y: evalY[start:end],
            textCNN.weights: weights,
            textCNN.dropout_keep_prob: 1.0,
            textCNN.iter: iteration,
            textCNN.tst: True
        }
        curr_eval_loss, curr_accc, logits = sess.run(
            [textCNN.loss_val, textCNN.accuracy, textCNN.logits],
            feed_dict)  #curr_eval_acc--->textCNN.accuracy
        true_positive, false_positive, true_negative, false_negative = compute_confuse_matrix(
            logits[0], evalY[start:end]
            [0])  #logits:[batch_size,label_size]-->logits[0]:[label_size]
        write_predict_error_to_file(start, file_object, logits[0],
                                    evalY[start:end][0], vocabulary_index2word,
                                    evalX1[start:end], evalX2[start:end])
        eval_loss, eval_accc, eval_counter = eval_loss + curr_eval_loss, eval_accc + curr_accc, eval_counter + 1
        eval_true_positive, eval_false_positive = eval_true_positive + true_positive, eval_false_positive + false_positive
        eval_true_negative, eval_false_negative = eval_true_negative + true_negative, eval_false_negative + false_negative
        # print("logits", type(logits), "evalY:", type(evalY))
        weights_label = compute_labels_weights(
            weights_label, logits, evalY[start:end]
        )  #compute_labels_weights(weights_label,logits,labels)
    print("true_positive:", eval_true_positive, ";false_positive:",
          eval_false_positive, ";true_negative:", eval_true_negative,
          ";false_negative:", eval_false_negative)
    p = float(eval_true_positive) / float(eval_true_positive +
                                          eval_false_positive + small_value)
    r = float(eval_true_positive) / float(eval_true_positive +
                                          eval_false_negative + small_value)
    f1_score = (2 * p * r) / (p + r + small_value)
    print("eval_counter:", eval_counter, ";eval_acc:", eval_accc)
    return eval_loss / float(eval_counter), eval_accc / float(
        eval_counter), f1_score, p, r, weights_label