Пример #1
0
def evaluate(eval_data, config):
    """ Build evaluation graph and run. """

    with tf.Graph().as_default():
        with tf.variable_scope('cnn'):
            if config.has_key('contextwise') and config['contextwise']:
                import cnn_context
                m = cnn_context.Model(config, is_train=False)
            else:
                import cnn
                m = cnn.Model(config, is_train=False)
        saver = tf.train.Saver(tf.all_variables())

        with tf.Session() as sess:
            ckpt = tf.train.get_checkpoint_state(config['train_dir'])
            if ckpt and ckpt.model_checkpoint_path:
                saver.restore(sess, ckpt.model_checkpoint_path)
            else:
                raise IOError("Loading checkpoint file failed!")

            #embeddings = sess.run(tf.all_variables())[0]

            print "\nStart evaluation\n"
            #losses = []
            #precision = []
            #recall = []
            #batches = util.batch_iter(eval_data, batch_size=config['batch_size'], num_epochs=1, shuffle=False)
            #for batch in batches:
            if config.has_key('contextwise') and config['contextwise']:
                left_batch, middle_batch, right_batch, y_batch, _ = zip(
                    *eval_data)
                feed = {
                    m.left: np.array(left_batch),
                    m.middle: np.array(middle_batch),
                    m.right: np.array(right_batch),
                    m.labels: np.array(y_batch)
                }
            else:
                x_batch, y_batch, _ = zip(*eval_data)
                feed = {
                    m.inputs: np.array(x_batch),
                    m.labels: np.array(y_batch)
                }
            loss, eval = sess.run([m.total_loss, m.eval_op], feed_dict=feed)
            #losses.append(loss)
            pre, rec = zip(*eval)
            #precision.append(pre)
            #recall.append(rec)

            avg_precision = np.mean(np.array(pre))
            avg_recall = np.mean(np.array(rec))
            auc = util.calc_auc_pr(pre, rec)
            f1 = (2.0 * pre[5] * rec[5]) / (pre[5] + rec[5])
            print '%s: loss = %.6f, f1 = %.4f, auc = %.4f' % (datetime.now(),
                                                              loss, f1, auc)

    return pre, rec
Пример #2
0
def label(eval_data, config):
    """ Build evaluation graph and run. """

    with tf.Graph().as_default():
        with tf.variable_scope('cnn'):
            if config.has_key('contextwise') and config['contextwise']:
                import cnn_context
                m = cnn_context.Model(config, is_train=False)
            else:
                import cnn
                m = cnn.Model(config, is_train=False)
        saver = tf.train.Saver(tf.global_variables())

        tf_config = tf.ConfigProto()
        if config.get("gpu_percentage", 0) > 0:
            tf_config.gpu_options.per_process_gpu_memory_fraction = config.get(
                "gpu_percentage", 0)
        else:
            tf_config = tf.ConfigProto(device_count={'GPU': 0})
        with tf.Session(config=tf_config) as sess:
            ckpt = tf.train.get_checkpoint_state(config['train_dir'])
            if ckpt and ckpt.model_checkpoint_path:
                saver.restore(sess, ckpt.model_checkpoint_path)
            else:
                raise IOError("Loading checkpoint file failed!")

            print "\nStart evaluation\n"

            x_data = np.array(eval_data)
            data_size = x_data.shape[0]
            batch_size = 10
            actual_output = []

            start_i = 0
            while start_i < data_size:
                end_i = min(start_i + batch_size, data_size)

                if config.has_key('contextwise') and config['contextwise']:
                    raise NotImplementedError
                    # left_batch, middle_batch, right_batch, y_batch, _ = zip(*eval_data)
                    # feed = {m.left: np.array(left_batch),
                    #         m.middle: np.array(middle_batch),
                    #         m.right: np.array(right_batch),
                    #         m.labels: np.array(y_batch)}
                else:
                    x_batch = eval_data[start_i:end_i]
                    feed = {m.inputs: x_batch}
                current_actual_output, = sess.run([m.scores], feed_dict=feed)
                actual_output.append(current_actual_output)
                start_i = end_i
    actual_output = np.concatenate(actual_output, axis=0)
    return x_data, actual_output
Пример #3
0
def evaluate(eval_data, config):
    """ Build evaluation graph and run. """

    with tf.Graph().as_default():
        with tf.variable_scope('cnn'):
            if config.has_key('contextwise') and config['contextwise']:
                import cnn_context
                m = cnn_context.Model(config, is_train=False)
            else:
                import cnn
                m = cnn.Model(config, is_train=False)
        saver = tf.train.Saver(tf.global_variables())

        with tf.Session() as sess:
            ckpt = tf.train.get_checkpoint_state(config['train_dir'])
            if ckpt and ckpt.model_checkpoint_path:
                saver.restore(sess, ckpt.model_checkpoint_path)
            else:
                raise IOError("Loading checkpoint file failed!")

            print "\nStart evaluation on test set ...\n"
            if config.has_key('contextwise') and config['contextwise']:
                left_batch, middle_batch, right_batch, y_batch, _ = zip(
                    *eval_data)
                feed = {
                    m.left: np.array(left_batch),
                    m.middle: np.array(middle_batch),
                    m.right: np.array(right_batch),
                    m.labels: np.array(y_batch)
                }
            else:
                x_batch, y_batch, _ = zip(*eval_data)
                feed = {
                    m.inputs: np.array(x_batch),
                    m.labels: np.array(y_batch)
                }
            loss, eval = sess.run([m.total_loss, m.eval_op], feed_dict=feed)
            pre, rec = zip(*eval)

            auc = util.calc_auc_pr(pre, rec)
            f1 = (2.0 * pre[5] * rec[5]) / (pre[5] + rec[5])
            print '%s: loss = %.6f, p = %.4f, r = %4.4f, f1 = %.4f, auc = %.4f' % (
                datetime.now(), loss, pre[5], rec[5], f1, auc)
    return pre, rec
def train(train_data, test_data):
    # train_dir
    timestamp = str(int(time.time()))
    out_dir = os.path.abspath(os.path.join(FLAGS.train_dir, timestamp))

    # save flags
    if not os.path.exists(out_dir):
        os.mkdir(out_dir)
    FLAGS._parse_flags()
    config = dict(FLAGS.__flags.items())

    # Window_size must not be larger than the sent_len
    if config['sent_len'] < config['max_window']:
        config['max_window'] = config['sent_len']

    # flag to restore the contextwise model
    config['contextwise'] = True

    # save flags
    util.dump_to_file(os.path.join(out_dir, 'flags.cPickle'), config)
    print "Parameters:"
    for k, v in config.iteritems():
        print '%20s %r' % (k, v)

    # max number of steps
    num_batches_per_epoch = int(
        np.ceil(float(len(train_data)) / FLAGS.batch_size))
    max_steps = num_batches_per_epoch * FLAGS.num_epochs

    with tf.Graph().as_default():
        with tf.variable_scope('cnn', reuse=None):
            m = cnn_context.Model(config, is_train=True)
        with tf.variable_scope('cnn', reuse=True):
            mtest = cnn_context.Model(config, is_train=False)

        # checkpoint
        saver = tf.train.Saver(tf.global_variables())
        save_path = os.path.join(out_dir, 'model.ckpt')
        summary_op = tf.summary.merge_all()

        # session
        with tf.Session().as_default() as sess:
            proj_config = tf.contrib.tensorboard.plugins.projector.ProjectorConfig(
            )
            embedding_left = proj_config.embeddings.add()
            embedding_middle = proj_config.embeddings.add()
            embedding_right = proj_config.embeddings.add()
            embedding_left.tensor_name = m.W_emb_left.name
            embedding_middle.tensor_name = m.W_emb_middle.name
            embedding_right.tensor_name = m.W_emb_right.name
            embedding_left.metadata_path = os.path.join(
                FLAGS.data_dir, 'vocab.txt')
            embedding_middle.metadata_path = os.path.join(
                FLAGS.data_dir, 'vocab.txt')
            embedding_right.metadata_path = os.path.join(
                FLAGS.data_dir, 'vocab.txt')

            train_summary_writer = tf.summary.FileWriter(os.path.join(
                out_dir, "train"),
                                                         graph=sess.graph)
            dev_summary_writer = tf.summary.FileWriter(os.path.join(
                out_dir, "dev"),
                                                       graph=sess.graph)
            tf.contrib.tensorboard.plugins.projector.visualize_embeddings(
                train_summary_writer, proj_config)
            tf.contrib.tensorboard.plugins.projector.visualize_embeddings(
                dev_summary_writer, proj_config)

            sess.run(tf.global_variables_initializer())

            # assign pretrained embeddings
            if FLAGS.use_pretrain:
                print "Initialize model with pretrained embeddings..."
                pretrained_embedding = np.load(
                    os.path.join(FLAGS.data_dir, 'emb.npy'))
                m.assign_embedding(sess, pretrained_embedding)

            # initialize parameters
            current_lr = FLAGS.init_lr
            lowest_loss_value = float("inf")
            decay_step_counter = 0
            global_step = 0

            # evaluate on dev set
            def dev_step(mtest, sess):
                dev_loss = []
                dev_auc = []
                dev_f1_score = []

                # create batch
                test_batches = util.batch_iter(test_data,
                                               batch_size=FLAGS.batch_size,
                                               num_epochs=1,
                                               shuffle=False)
                for batch in test_batches:
                    left_batch, middle_batch, right_batch, y_batch, _ = zip(
                        *batch)
                    feed = {
                        mtest.left: np.array(left_batch),
                        mtest.middle: np.array(middle_batch),
                        mtest.right: np.array(right_batch),
                        mtest.labels: np.array(y_batch)
                    }
                    loss_value, eval_value = sess.run(
                        [mtest.total_loss, mtest.eval_op], feed_dict=feed)
                    dev_loss.append(loss_value)
                    pre, rec = zip(*eval_value)
                    dev_auc.append(util.calc_auc_pr(pre, rec))
                    dev_f1_score.append((2.0 * pre[5] * rec[5]) /
                                        (pre[5] + rec[5]))  # threshold = 0.5

                return np.mean(dev_loss), np.mean(dev_auc), np.mean(
                    dev_f1_score)

            # train loop
            print "\nStart training (save checkpoints in %s)\n" % out_dir
            train_loss = []
            train_auc = []
            train_f1_score = []
            train_batches = util.batch_iter(train_data,
                                            batch_size=FLAGS.batch_size,
                                            num_epochs=FLAGS.num_epochs)
            for batch in train_batches:
                batch_size = len(batch)

                m.assign_lr(sess, current_lr)
                global_step += 1

                left_batch, middle_batch, right_batch, y_batch, a_batch = zip(
                    *batch)
                feed = {
                    m.left: np.array(left_batch),
                    m.middle: np.array(middle_batch),
                    m.right: np.array(right_batch),
                    m.labels: np.array(y_batch)
                }
                if FLAGS.attention:
                    feed[m.attention] = np.array(a_batch)
                start_time = time.time()
                _, loss_value, eval_value = sess.run(
                    [m.train_op, m.total_loss, m.eval_op], feed_dict=feed)
                proc_duration = time.time() - start_time
                train_loss.append(loss_value)
                pre, rec = zip(*eval_value)
                auc = util.calc_auc_pr(pre, rec)
                f1 = (2.0 * pre[5] * rec[5]) / (pre[5] + rec[5]
                                                )  # threshold = 0.5
                train_auc.append(auc)
                train_f1_score.append(f1)

                assert not np.isnan(loss_value), "Model loss is NaN."

                # print log
                if global_step % FLAGS.log_step == 0:
                    examples_per_sec = batch_size / proc_duration
                    format_str = '%s: step %d/%d, f1 = %.4f, auc = %.4f, loss = %.4f ' + \
                                 '(%.1f examples/sec; %.3f sec/batch), lr: %.6f'
                    print format_str % (datetime.now(), global_step, max_steps,
                                        f1, auc, loss_value, examples_per_sec,
                                        proc_duration, current_lr)

                # write summary
                if global_step % FLAGS.summary_step == 0:
                    summary_str = sess.run(summary_op)
                    train_summary_writer.add_summary(summary_str, global_step)
                    dev_summary_writer.add_summary(summary_str, global_step)

                    # summary loss, f1
                    train_summary_writer.add_summary(_summary_for_scalar(
                        'loss', np.mean(train_loss)),
                                                     global_step=global_step)
                    train_summary_writer.add_summary(_summary_for_scalar(
                        'auc', np.mean(train_auc)),
                                                     global_step=global_step)
                    train_summary_writer.add_summary(_summary_for_scalar(
                        'f1', np.mean(train_f1_score)),
                                                     global_step=global_step)

                    dev_loss, dev_auc, dev_f1 = dev_step(mtest, sess)
                    dev_summary_writer.add_summary(_summary_for_scalar(
                        'loss', dev_loss),
                                                   global_step=global_step)
                    dev_summary_writer.add_summary(_summary_for_scalar(
                        'auc', dev_auc),
                                                   global_step=global_step)
                    dev_summary_writer.add_summary(_summary_for_scalar(
                        'f1', dev_f1),
                                                   global_step=global_step)

                    print "\n===== write summary ====="
                    print "%s: step %d/%d: train_loss = %.6f, train_auc = %.4f train_f1 = %.4f" \
                          % (datetime.now(), global_step, max_steps,
                             np.mean(train_loss), np.mean(train_auc), np.mean(train_f1_score))
                    print "%s: step %d/%d:   dev_loss = %.6f,   dev_auc = %.4f   dev_f1 = %.4f\n" \
                          % (datetime.now(), global_step, max_steps, dev_loss, dev_auc, dev_f1)

                    # reset container
                    train_loss = []
                    train_auc = []
                    train_f1_score = []

                # decay learning rate if necessary
                if loss_value < lowest_loss_value:
                    lowest_loss_value = loss_value
                    decay_step_counter = 0
                else:
                    decay_step_counter += 1
                if decay_step_counter >= FLAGS.tolerance_step:
                    current_lr *= FLAGS.lr_decay
                    print '%s: step %d/%d, Learning rate decays to %.5f' % \
                          (datetime.now(), global_step, max_steps, current_lr)
                    decay_step_counter = 0

                # stop learning if learning rate is too low
                if current_lr < 1e-5:
                    break

                # save checkpoint
                if global_step % FLAGS.checkpoint_step == 0:
                    saver.save(sess, save_path, global_step=global_step)
            saver.save(sess, save_path, global_step=global_step)
Пример #5
0
def evaluate(eval_data, config):
    """ Build evaluation graph and run. """

    with tf.Graph().as_default():
        with tf.variable_scope('cnn'):
            if config.has_key('contextwise') and config['contextwise']:
                import cnn_context
                m = cnn_context.Model(config, is_train=False)
            else:
                import cnn
                m = cnn.Model(config, is_train=False)
        saver = tf.train.Saver(tf.global_variables())

        with tf.Session() as sess:
            ckpt = tf.train.get_checkpoint_state(config['train_dir'])
            if ckpt and ckpt.model_checkpoint_path:
                saver.restore(sess, ckpt.model_checkpoint_path)
            else:
                raise IOError("Loading checkpoint file failed!")

            #embeddings = sess.run(tf.global_variables())[0]

            print "\nStart evaluation\n"
            #losses = []
            #precision = []
            #recall = []
            #batches = util.batch_iter(eval_data, batch_size=config['batch_size'], num_epochs=1, shuffle=False)
            #for batch in batches:
            if config.has_key('contextwise') and config['contextwise']:
                left_batch, middle_batch, right_batch, y_batch, _ = zip(*eval_data)
                feed = {m.left: np.array(left_batch),
                        m.middle: np.array(middle_batch),
                        m.right: np.array(right_batch),
                        m.labels: np.array(y_batch)}
            else:
                x_batch, y_batch, _ = zip(*eval_data)
                feed = {m.inputs: np.array(x_batch), m.labels: np.array(y_batch)}
            loss, eval, actual_output, eval_per_class = sess.run([m.total_loss, m.eval_op, m.scores, m.eval_class_op], feed_dict=feed)
            #losses.append(loss)
            pre, rec = zip(*eval)
            #precision.append(pre)
            #recall.append(rec)

            avg_precision = np.mean(np.array(pre))
            avg_recall = np.mean(np.array(rec))
            auc = util.calc_auc_pr(pre, rec)
            f1 = (2.0 * pre[5] * rec[5]) / (pre[5] + rec[5])
            print '%s: Overall\nloss = %.6f, f1 = %.4f, auc = %.4f' % (datetime.now(), loss, f1, auc)

            pre_per_class, rec_per_class = zip(*eval_per_class)
            num_class = len(pre_per_class)
            for class_i in range(num_class):
                current_pre = pre_per_class[class_i]
                current_rec = rec_per_class[class_i]
                current_auc = util.calc_auc_pr(current_pre, current_rec)
                current_f1 = (2.0 * current_pre[5] * current_rec[5]) / (current_pre[5] + current_rec[5])
                print 'Class "%s": precision = %.4f, recall = %.4f, f1 = %.4f, auc = %.4f' % (CLASS_NAMES[class_i], current_pre[5], current_rec[5], current_f1, current_auc)


    x_batch = np.array(x_batch)
    y_batch = np.array(y_batch)
    # Now calculate the true probability distribution using softmax.
    actual_output_exp = np.exp(actual_output)
    actual_output_softmax = actual_output_exp / np.sum(actual_output_exp, axis=1, keepdims=True)
    plot_precision_recall(y_batch,actual_output_softmax)

    return pre, rec, x_batch, y_batch, actual_output