Ejemplo n.º 1
0
def main(_):
    #1. load data
    traing_data, valid_data, test_data, vocab_size, intent_num_classes, slots_num_classes = generate_training_data(FLAGS.data_source,FLAGS.knowledge_path,FLAGS.test_mode,sequence_length=FLAGS.sequence_length)
    x_train, y_intent_train, y_slots_train=traing_data
    x_valid, y_intent_valid, y_slots_valid = valid_data
    x_test, y_intent_test, y_slots_test = test_data

    # 2.create session.
    config = tf.ConfigProto()
    config.gpu_options.allow_growth = True
    with tf.Session(config=config) as sess:
        # Instantiate Model
        sequence_length_batch=[FLAGS.sequence_length]*FLAGS.batch_size
        model=joint_knowledge_model(intent_num_classes, FLAGS.learning_rate, FLAGS.decay_steps, FLAGS.decay_rate, FLAGS.sequence_length,
                 vocab_size, FLAGS.embed_size,FLAGS.hidden_size, sequence_length_batch,slots_num_classes,FLAGS.is_training)
        # Initialize Save
        saver = tf.train.Saver()
        if os.path.exists(FLAGS.ckpt_dir + "checkpoint"):
            print("Restoring Variables from Checkpoint")
            saver.restore(sess, tf.train.latest_checkpoint(FLAGS.ckpt_dir))
        else:
            print('Initializing Variables')
            sess.run(tf.global_variables_initializer())
        curr_epoch = sess.run(model.epoch_step)
        # 3.feed data & training
        number_of_training_data = len(x_train)
        print("number_of_training_data:", number_of_training_data)
        previous_eval_loss = 10000
        best_eval_loss = 10000
        batch_size = FLAGS.batch_size
        for epoch in range(curr_epoch, FLAGS.num_epochs):
            loss, acc_intent,acc_slot, counter = 0.0,0.0, 0.0, 0
            for start, end in zip(range(0, number_of_training_data, batch_size),
                                  range(batch_size, number_of_training_data, batch_size)):
                if epoch == 0 and counter == 0:#print sample to have a look
                    print("trainX[start:end]:", x_train[0:3])
                    print("y_intent_train[start:end]:", y_intent_train[0:3])
                    print("y_slots_train[start:end]:", y_slots_train[0:3])
                feed_dict = {model.x: x_train[start:end], model.dropout_keep_prob: 0.5}
                feed_dict[model.y_intent] = y_intent_train[start:end]
                feed_dict[model.y_slots] = y_slots_train[start:end]
                curr_loss, curr_acc_intent,curr_acc_slot, _ = sess.run([model.loss_val, model.accuracy_intent,model.accuracy_slot, model.train_op],feed_dict)
                loss, counter, acc_intent,acc_slot = loss + curr_loss, counter + 1, acc_intent + curr_acc_intent,acc_slot+curr_acc_slot
                if counter % 50 == 0:
                    print("joint_intent_slots_knowledge_model==>Epoch %d\tBatch %d\tTrain Loss:%.3f\tTrain Accuracy_intent:%.3f\tTrain Accuracy_slot:%.3f" %(epoch, counter, loss / float(counter),acc_intent / float(counter),acc_slot / float(counter)))

                if start==0 or start % (FLAGS.validate_step * FLAGS.batch_size) == 0:#evaluation.
                    eval_loss,eval_acc_intent,eval_acc_slot = do_eval(sess, model, x_valid, y_intent_valid, y_slots_valid, batch_size)
                    print("joint_intent_slots_knowledge_model.validation.part. previous_eval_loss:",previous_eval_loss ,";current_eval_loss:",eval_loss,";acc_intent:",eval_acc_intent,";acc_slot:",eval_acc_slot)
                    if eval_loss > previous_eval_loss:  # if loss is not decreasing
                        # reduce the learning rate by a factor of 0.5
                        print("joint_intent_slots_knowledge_model==>validation.part.going to reduce the learning rate.")
                        learning_rate1 = sess.run(model.learning_rate)
                        lrr = sess.run([model.learning_rate_decay_half_op])
                        learning_rate2 = sess.run(model.learning_rate)
                        print("joint_intent_slots_knowledge_model==>validation.part.learning_rate1:", learning_rate1," ;learning_rate2:", learning_rate2)
                    else:  # loss is decreasing
                        if eval_loss < best_eval_loss:
                            print("joint_intent_slots_knowledge_model==>going to save the model.eval_loss:",eval_loss, ";best_eval_loss:",best_eval_loss)
                            # save model to checkpoint
                            save_path = FLAGS.ckpt_dir + "model.ckpt"
                            saver.save(sess, save_path, global_step=epoch)
                            best_eval_loss = eval_loss
                    previous_eval_loss = eval_loss

            # epoch increment
            print("going to increment epoch counter....")
            sess.run(model.epoch_increment)

        # 5.最后在测试集上做测试,并报告测试准确率 Test
        test_loss, test_acc_intent,test_acc_slot = do_eval(sess, model, x_test, y_intent_test, y_slots_test, batch_size)
        print("test_loss:",test_loss,";test_acc_intent:",test_acc_intent,";test_acc_slot:",test_acc_slot)
    pass
Ejemplo n.º 2
0
intent_num_classes = len(word2id_intent)
vocab_size = len(word2id)
slots_num_classes = len(id2word_slotname)

config = tf.ConfigProto()
config.gpu_options.allow_growth = True
sess = tf.Session(config=config)
FLAGS.batch_size = 1
sequence_length_batch = [FLAGS.sequence_length] * FLAGS.batch_size
model = joint_knowledge_model(intent_num_classes,
                              FLAGS.learning_rate,
                              FLAGS.decay_steps,
                              FLAGS.decay_rate,
                              FLAGS.sequence_length,
                              vocab_size,
                              FLAGS.embed_size,
                              FLAGS.hidden_size,
                              sequence_length_batch,
                              slots_num_classes,
                              FLAGS.is_training,
                              S_Q_len=len(q_list_index))
# initialize Saver
saver = tf.train.Saver()
print('restoring Variables from Checkpoint!')
saver.restore(sess, tf.train.latest_checkpoint(FLAGS.ckpt_dir))

slot_values_file = FLAGS.knowledge_path + '/slot_values.txt'
jieba.load_userdict(slot_values_file)


def main(_):