text_CNN.input_y: y_batch,
                text_CNN.dropout_keep_prob: 1.0
            }
            step, summaries, loss, accuracy = sess.run([
                global_step, validation_summary_op, text_CNN.loss,
                text_CNN.accuracy
            ], feed)
            time_str = time.strftime('%Y-%m-%d_%H-%M-%S',
                                     time.localtime(time.time()))
            print("{}: step {}, loss {:g}, accuracy {:g}".format(
                time_str, step, loss, accuracy))
            if writer:
                writer.add_summary(summaries, step)

        # Generate batches
        batches = data_processor.batch_iter(list(zip(x_train, y_train)),
                                            FLAGS.batch_size, FLAGS.num_epochs)
        # Training loop. For each batch...
        for batch in batches:
            x_batch, y_batch = zip(*batch)
            train_step(x_batch, y_batch)
            current_step = tf.train.global_step(sess, global_step)
            if current_step % FLAGS.period_evaluation == 0:
                print("\nEvaluation:")
                validate_step(x_validation,
                              y_validation,
                              writer=validation_summary_writer)
                print("")
            if current_step % FLAGS.period_checkpoint == 0:
                path = saver.save(sess,
                                  checkpoint_filename,
                                  global_step=current_step)
예제 #2
0
def train(x_train, y_train, vocab_processor, x_dev, y_dev):
    # Training
    # ==================================================

    with tf.Graph().as_default():
        session_conf = tf.ConfigProto(
          allow_soft_placement=FLAGS.allow_soft_placement,
          log_device_placement=FLAGS.log_device_placement)
        sess = tf.Session(config=session_conf)
        with sess.as_default():
            cnn = TextCNN(
                sequence_length=x_train.shape[1],
                num_classes=y_train.shape[1],
                vocab_size=len(vocab_processor.vocabulary_),
                embedding_size=FLAGS.embedding_dim,
                filter_sizes=list(map(int, FLAGS.filter_sizes.split(","))),
                num_filters=FLAGS.num_filters,
                l2_reg_lambda=FLAGS.l2_reg_lambda)

            # Define Training procedure
            global_step = tf.Variable(0, name="global_step", trainable=False)
            optimizer = tf.train.AdamOptimizer(1e-3)
            grads_and_vars = optimizer.compute_gradients(cnn.loss)
            train_op = optimizer.apply_gradients(grads_and_vars, global_step=global_step)

            # Keep track of gradient values and sparsity (optional)
            grad_summaries = []
            for g, v in grads_and_vars:
                if g is not None:
                    grad_hist_summary = tf.summary.histogram("{}/grad/hist".format(v.name), g)
                    sparsity_summary = tf.summary.scalar("{}/grad/sparsity".format(v.name), tf.nn.zero_fraction(g))
                    grad_summaries.append(grad_hist_summary)
                    grad_summaries.append(sparsity_summary)
            grad_summaries_merged = tf.summary.merge(grad_summaries)

            # Output directory for models and summaries
            timestamp = str(int(time.time()))
            out_dir = os.path.abspath(os.path.join(os.path.curdir, "runs", timestamp))
            print("Writing to {}\n".format(out_dir))

            # Summaries for loss and accuracy
            loss_summary = tf.summary.scalar("loss", cnn.loss)
            acc_summary = tf.summary.scalar("accuracy", cnn.accuracy)

            # Train Summaries
            train_summary_op = tf.summary.merge([loss_summary, acc_summary, grad_summaries_merged])
            train_summary_dir = os.path.join(out_dir, "summaries", "train")
            train_summary_writer = tf.summary.FileWriter(train_summary_dir, sess.graph)

            # Dev summaries
            dev_summary_op = tf.summary.merge([loss_summary, acc_summary])
            dev_summary_dir = os.path.join(out_dir, "summaries", "dev")
            dev_summary_writer = tf.summary.FileWriter(dev_summary_dir, sess.graph)

            # Checkpoint directory. Tensorflow assumes this directory already exists so we need to create it
            checkpoint_dir = os.path.abspath(os.path.join(out_dir, "checkpoints"))
            checkpoint_prefix = os.path.join(checkpoint_dir, "model")
            if not os.path.exists(checkpoint_dir):
                os.makedirs(checkpoint_dir)
            saver = tf.train.Saver(tf.global_variables(), max_to_keep=FLAGS.num_checkpoints)

            # Write vocabulary
            vocab_processor.save(os.path.join(out_dir, "vocab"))

            # Initialize all variables
            sess.run(tf.global_variables_initializer())

            def train_step(x_batch, y_batch):
                """
                A single training step
                """
                feed_dict = {
                  cnn.input_x: x_batch,
                  cnn.input_y: y_batch,
                  cnn.dropout_keep_prob: FLAGS.dropout_keep_prob
                }
                _, step, summaries, loss, accuracy = sess.run(
                    [train_op, global_step, train_summary_op, cnn.loss, cnn.accuracy],
                    feed_dict)
                time_str = datetime.datetime.now().isoformat()
                print("{}: step {}, loss {:g}, acc {:g}".format(time_str, step, loss, accuracy))
                train_summary_writer.add_summary(summaries, step)

            def dev_step(x_batch, y_batch, writer=None):
                """
                Evaluates model on a dev set
                """
                feed_dict = {
                  cnn.input_x: x_batch,
                  cnn.input_y: y_batch,
                  cnn.dropout_keep_prob: 1.0
                }
                step, summaries, loss, accuracy = sess.run(
                    [global_step, dev_summary_op, cnn.loss, cnn.accuracy],
                    feed_dict)
                time_str = datetime.datetime.now().isoformat()
                print("{}: step {}, loss {:g}, acc {:g}".format(time_str, step, loss, accuracy))
                if writer:
                    writer.add_summary(summaries, step)

            # Generate batches
            batches = data_processor.batch_iter(
                list(zip(x_train, y_train)), FLAGS.batch_size, FLAGS.num_epochs)
            # Training loop. For each batch...
            for batch in batches:
                x_batch, y_batch = zip(*batch)
                train_step(x_batch, y_batch)
                current_step = tf.train.global_step(sess, global_step)
                if current_step % FLAGS.evaluate_every == 0:
                    print("\nEvaluation:")
                    dev_step(x_dev, y_dev, writer=dev_summary_writer)
                    print("")
                if current_step % FLAGS.checkpoint_every == 0:
                    path = saver.save(sess, checkpoint_prefix, global_step=current_step)
                    print("Saved model checkpoint to {}\n".format(path))
예제 #3
0
                pred = np.concatenate(predicts)
                y_dev = np.concatenate(actuals)
                f1 = f1_score(y_dev, pred, average='weighted')
                accuracy = np.sum(pred == y_dev) / len(pred)
                time_str = datetime.datetime.now().isoformat()
                print("{}: step {}, loss {:g}, dev acc {}, f1-score {}".format(
                    time_str, step, loss, accuracy, f1))
                with open(logfile, "a") as log:
                    log.write(
                        "{}: step {}, loss {:g}, dev acc {:g},f1-score {:g} \n"
                        .format(time_str, step, loss, accuracy, f1))
                    log.write("\n")
                    log.write("Training Steps: \n")

            # Generating batches
            batches = data_processor.batch_iter(list(zip(train_x, train_y)),
                                                batch_size, num_epoch)

            # Training executions
            devbatches = data_processor.batch_iter(list(zip(dev_x, dev_y)),
                                                   100, 1)
            for batch in batches:
                x_batch, y_batch = zip(*batch)
                train_step(x_batch, y_batch)

                current_step = tf.train.global_step(sess, global_step)
                if current_step % 6000 == 0:
                    with open(logfile, "a") as log:
                        log.write("\nDev Set Evaluation:\n")

                    print("\nDev Set Evaluation:")
                    dev_step(devbatches)
        # input_y = graph.get_operation_by_name("input_y").outputs[0]
        dropout_keep_prob = graph.get_operation_by_name(
            "dropout_keep_prob").outputs[0]

        # Tensors we want to evaluate
        predictions = graph.get_operation_by_name(
            "output/predictions").outputs[0]
        scores = graph.get_operation_by_name("output/scores").outputs[0]
        features = graph.get_operation_by_name("reshape").outputs[0]

        feature_length = sess.run(
            graph.get_operation_by_name("feature_length").outputs[0])

        # Generate batches for one epoch
        batches = data_processor.batch_iter(list(x_test),
                                            FLAGS.batch_size,
                                            1,
                                            shuffle=False)

        # Collect the features
        all_features = np.zeros(feature_length)
        all_predictions = []

        for x_test_batch in batches:
            batch_predictions = sess.run(predictions, {
                input_x: x_test_batch,
                dropout_keep_prob: 1.0
            })
            all_predictions = np.concatenate(
                [all_predictions, batch_predictions])
            batch_features = sess.run(features, {
                input_x: x_test_batch,
예제 #5
0
    def model(txt):
        # Map data into vocabulary
        checkpoint = './runs/1518619812/checkpoints/'
        vocab_path = os.path.join(checkpoint, "..", "vocab")
        vocab_processor = learn.preprocessing.VocabularyProcessor.restore(
            vocab_path)
        # x_test = np.array(list(vocab_processor.transform(x_raw)))

        print("\nEvaluating...\n")

        checkpoint_file = tf.train.latest_checkpoint(checkpoint)
        graph = tf.Graph()

        with graph.as_default():
            session_conf = tf.ConfigProto(
                allow_soft_placement=FLAGS.allow_soft_placement,
                log_device_placement=FLAGS.log_device_placement)
            sess = tf.Session(config=session_conf)
            with sess.as_default():
                # Load the saved meta graph and restore variables
                saver = tf.train.import_meta_graph(
                    "{}.meta".format(checkpoint_file))
                saver.restore(sess, checkpoint_file)

                # Get the placeholders from the graph by name
                input_x = graph.get_operation_by_name("input_x").outputs[0]
                # input_y = graph.get_operation_by_name("input_y").outputs[0]
                dropout_keep_prob = graph.get_operation_by_name(
                    "dropout_keep_prob").outputs[0]

                # Tensors we want to evaluate
                predictions = graph.get_operation_by_name(
                    "output/predictions").outputs[0]

                x_raw = []
                #y_test=None
                x_raw.append(txt)
                x_test = np.array(list(vocab_processor.transform(x_raw)))

                batches = data_processor.batch_iter(list(x_test),
                                                    FLAGS.batch_size,
                                                    1,
                                                    shuffle=False)

                # Collect the predictions here
                all_predictions = []

                for x_test_batch in batches:
                    batch_predictions = sess.run(predictions, {
                        input_x: x_test_batch,
                        dropout_keep_prob: 1.0
                    })
                    batch_predictions = [
                        _CLASSES[x] for x in batch_predictions
                    ]
                    all_predictions = np.concatenate(
                        [all_predictions, batch_predictions])
                    print(batch_predictions)
                    for i in range(len(x_raw)):
                        output_data = {
                            "input": txt,
                            "output": all_predictions[i]
                        }
                        print(output_data)
                        return output_data