Ejemplo n.º 1
0
def train_model(data, word_embeddings):
    # 10-fold cross validation
    n_fold = 10
    fold_size = int(len(data[0]) / n_fold)

    loss_list, acc_list = [], []
    for i in range(1, n_fold + 1):
        FLAGS.train_time = i
        train_data, valid_data = utils.split_train_valid(data, i, fold_size)
        graph = tf.Graph()
        with tf.Session(graph=graph) as sess:
            model = Classifier(FLAGS, sess)
            model.build_model()
            loss, acc = model.run(train_data, valid_data, word_embeddings)
            loss_list.append(loss)
            acc_list.append(acc)

    avg_loss = np.mean(loss_list)
    avg_acc = np.mean(acc_list)
    print("10fold_loss&acc:", avg_loss, avg_acc)
    print('10fold_std_loss&acc:', np.std(loss_list), np.std(acc_list))
    logging.debug('10fold_loss: ' + str(avg_loss) + '\t10fold_acc :' +
                  str(avg_acc))
    logging.debug('10fold_loss_std: ' + str(np.std(loss_list)) +
                  '\t10fold_acc_std :' + str(np.std(acc_list)))
Ejemplo n.º 2
0
def main():
    # data loading
    data = Data(params_logger=params_logger,
                train_logger=train_logger,
                embedding_path=Path.skpgrm_path,
                data_limit=None,
                w2v_limit=None)

    # classifier configuration and building
    classifier = Classifier(model_name='niko',
                            max_seqlen=data.max_seqlen,
                            vocab_size=data.vocab_size,
                            n_dummy=data.n_dummy,
                            pretrained_embedding=data.embedding_matrix,
                            params_logger=params_logger,
                            train_logger=train_logger)
    classifier.build_model()

    # training phase (model kept every 5 epochs)
    print("train.shape: ", data.train_x.shape)

    # if max_seqlen is too small, train_x has only 2dim shapes so it will raise error
    inputs = [data.train_x[:, i, :] for i in range(data.train_x.shape[1])]
    answers = data.y

    save_weight_path = os.path.join(save_model_path,
                                    "weights.{epoch:02d}-{val_loss:.2f}.hdf5")
    output_dict = classifier.train(inputs,
                                   answers,
                                   save_output=True,
                                   validation_split=data.validation_split,
                                   save_path=save_weight_path)
    data_dict = data.retrieve_data()

    # test phase
    # TODO: make code clean (wrap these process up as one method in Data class)
    test_stories = [data.test_x[:, i, :] for i in range(data.test_x.shape[1])]
    test_inputs_with_1 = test_stories + [data.test_e1]
    test_inputs_with_2 = test_stories + [data.test_e2]
    answer_with_1 = classifier.test(
        test_inputs_with_1, batchsize=32)  # bsize for test does not matter
    answer_with_2 = classifier.test(test_inputs_with_2, batchsize=32)

    # test accuracy
    acc = classifier.calculate_accuracy(answer_with_1,
                                        answer_with_2,
                                        gt=data.test_answers)
    train_logger.info("test acc: {}".format(acc / float(data.test_x.shape[0])))

    # model and output saving
    save_intermed_output_path = os.path.join(save_model_path,
                                             "output_dict.pkl")
    save_data_path = os.path.join(save_model_path, "data.pkl")

    with open(save_intermed_output_path, 'wb') as w:
        pickle.dump(output_dict, w, protocol=4)
        train_logger.info(
            "output_dict saved: {}".format(save_intermed_output_path))
    with open(save_data_path, 'wb') as w:
        pickle.dump(data_dict, w, protocol=4)
        train_logger.info("data_dict saved: {}".format(save_data_path))