예제 #1
0
def get_baseline_model():
    # get the train and predict model model

    embedding_file, vocab_size = get_default_inputs_for_model()

    qa_model = QAModel()
    train_model, prediction_model = qa_model.get_lstm_cnn_model(
        embedding_file, vocab_size)
    logger.info('Default created: Baseline')
    logger.info('enc_timesteps = 30,\
                               dec_timesteps = 30, hidden_dim = 50, filters = 500, kernel_sizes = [2, 3, 5, 7]'
                )
    return train_model, prediction_model
예제 #2
0
def get_small_model():
    # small model
    embedding_file, vocab_size = get_default_inputs_for_model()
    enc_timesteps = 30
    dec_timesteps = 30
    hidden_dim = 10
    filters = 20
    qa_model = QAModel()
    small_train_model, small_prediction_model = qa_model.get_lstm_cnn_model(
        embedding_file,
        vocab_size,
        enc_timesteps=enc_timesteps,
        dec_timesteps=dec_timesteps,
        filters=filters,
        hidden_dim=hidden_dim)
    logger.info('Model created: Small')
    logger.info(f'enc_timesteps = {enc_timesteps},\
                                       dec_timesteps = {dec_timesteps},'
                f' hidden_dim = {hidden_dim}, filters = {filters}, '
                f'kernel_sizes = [2, 3, 5, 7]')
    return small_train_model, small_prediction_model
예제 #3
0
def get_larger_model():
    enc_timesteps = 30
    dec_timesteps = 30
    hidden_dim = 200
    filters = 500

    embedding_file, vocab_size = get_default_inputs_for_model()

    qa_model = QAModel()
    larger_train_model, larger_prediction_model = qa_model.get_lstm_cnn_model(
        embedding_file,
        vocab_size,
        enc_timesteps=enc_timesteps,
        dec_timesteps=dec_timesteps,
        filters=filters,
        hidden_dim=hidden_dim)
    logger.info('Model created: Larger')
    logger.info(f'enc_timesteps = {enc_timesteps},\
                                               dec_timesteps = {dec_timesteps},'
                f' hidden_dim = {hidden_dim}, filters = {filters}, '
                f'kernel_sizes = [2, 3, 5, 7]')
    return larger_train_model, larger_prediction_model
def main(mode='test', question=None, answers=None):
    """
    This function is used to train, predict or test

    Args:
        mode (str): train/preddict/test
        question (str): this contains the question
        answers (list): this contains list of answers in string format

    Returns:
        index (integer): index of the most likely answer
    """

    # get the train and predict model
    vocabulary = Vocabulary("./data/vocab_all.txt")
    embedding_file = "./data/word2vec_100_dim.embeddings"
    qa_model = QAModel()
    train_model, predict_model = qa_model.get_lstm_cnn_model(
        embedding_file, len(vocabulary))

    epoch = 1
    if mode == 'train':
        for i in range(epoch):
            print('Training epoch', i)

            # load training data
            qa_data = QAData()
            questions, good_answers, bad_answers = qa_data.get_training_data()

            # train the model
            Y = np.zeros(shape=(questions.shape[0], ))
            train_model.fit([questions, good_answers, bad_answers],
                            Y,
                            epochs=1,
                            batch_size=64,
                            validation_split=0.1,
                            verbose=1)

            # save the trained model
            train_model.save_weights('model/train_weights_epoch_' +
                                     str(epoch) + '.h5',
                                     overwrite=True)
            predict_model.save_weights('model/predict_weights_epoch_' +
                                       str(epoch) + '.h5',
                                       overwrite=True)
    elif mode == 'predict':
        # load the evaluation data
        data = pickle.load(open("./data/dev.pkl", 'rb'))
        random.shuffle(data)

        # load weights from trained model
        qa_data = QAData()
        predict_model.load_weights('model/cnnlstm_predict_weights_epoch_1.h5')

        c = 0
        c1 = 0
        total = 0
        for i, d in enumerate(data):
            print(i, len(d['question']))
            #if(len(d['question']) > 7):
            # pad the data and get it in desired format
            indices, answers, question = qa_data.process_data(d)
            total += 1
            # get the similarity score
            sims = predict_model.predict([question, answers])
            n_good = len(d['good'])
            max_r = np.argmax(sims)
            max_n = np.argmax(sims[:n_good])
            r = rankdata(sims, method='max')
            c += 1 if max_r == max_n else 0
            c1 += 1 / float(r[max_r] - r[max_n] + 1)
            precision = c / float(total)  #len(data))
            mrr = c1 / float(total)  #len(data))
            print("Precision", precision)
            print("MRR", mrr)
            #break

        precision = c / float(total)  #len(data))
        mrr = c1 / float(total)  #len(data))
        print("Precision", precision)
        print("MRR", mrr)
    elif mode == 'test':
        # question and answers come from params
        qa_data = QAData()
        answers, question = qa_data.process_test_data(question, answers)

        # load weights from the trained model
        predict_model.load_weights('model/lstm_predict_weights_epoch_1.h5')

        # get similarity score
        sims = predict_model.predict([question, answers])
        max_r = np.argmax(sims)
        return max_r
예제 #5
0
@author: tarun
"""


from data import QAData, Vocabulary
from model import QAModel
import pickle
import numpy as np
import random
from keras.models import Model
import matplotlib.pyplot as plt

vocabulary = Vocabulary("./data/vocab_all.txt")
embedding_file = "./data/word2vec_100_dim.embeddings"
qa_model = QAModel()
train_model, predict_model = qa_model.get_lstm_cnn_model(embedding_file, len(vocabulary))

# layer_outputs = [predict_model.layers[0].output, predict_model.layers[1].output, predict_model.layers[2].layers[0].output, predict_model.layers[2].layers[0].output,
#                  predict_model.layers[2].layers[1].output, predict_model.layers[2].layers[2].get_output_at(0),
#                  predict_model.layers[2].layers[2].get_output_at(1), predict_model.layers[2].layers[3].get_output_at(0),
#                  predict_model.layers[2].layers[3].get_output_at(1), predict_model.layers[2].layers[4].get_output_at(0),
#                  predict_model.layers[2].layers[4].get_output_at(1), predict_model.layers[2].layers[5].output,
#                  predict_model.layers[2].layers[6].output, predict_model.layers[2].layers[7].get_output_at(0),
#                  predict_model.layers[2].layers[7].get_output_at(1), predict_model.layers[2].layers[8].get_output_at(0),
#                  predict_model.layers[2].layers[8].get_output_at(1), predict_model.layers[2].layers[9].get_output_at(0),
#                  predict_model.layers[2].layers[9].get_output_at(1), predict_model.layers[2].layers[10].get_output_at(0),
#                  predict_model.layers[2].layers[10].get_output_at(1), predict_model.layers[2].layers[11].output,
#                  predict_model.layers[2].layers[11].output, predict_model.layers[2].layers[13].get_output_at(0),
#                  predict_model.layers[2].layers[13].get_output_at(1), predict_model.layers[2].layers[14].output]

layer_outputs = [predict_model.layers[2].layers[13].get_output_at(0)]#, predict_model.layers[2].layers[13].get_output_at(1), predict_model.layers[2].layers[14].output]
예제 #6
0
파일: qa.py 프로젝트: halftru/747QA
def main(mode='test'):
    # get the train and predict model model
    vocabulary = Vocabulary("./data/vocab_all.txt")
    embedding_file = "./data/word2vec_100_dim.embeddings"
    qa_model = QAModel()
    train_model, predict_model = qa_model.get_lstm_cnn_model(embedding_file, len(vocabulary))
    epo = 100
    if mode == 'train':
        # load training data
        qa_data = QAData()
        questions, good_answers, bad_answers = qa_data.get_training_data()

        callbacks = [EarlyStopping(monitor='val_loss', patience=20),
                     ModelCheckpoint(filepath='best_model.h5', monitor='val_loss', save_best_only=True)]
        # train the model
        Y = np.zeros(shape=(questions.shape[0],))
        train_model.fit([questions, good_answers, bad_answers], Y, epochs=epo, batch_size=64, validation_split=0.1,
                        verbose=1, callbacks=callbacks)

        # save the trained model
        # train_model.save_weights('model/train_weights_epoch_' + str(epo) + '.h5', overwrite=True)
        model = keras.models.load_model('best_model.h5')
        model.save_weights('model/best_weights_epoch_' + str(epo) + '.h5', overwrite=True)
        predict_model.save_weights('model/predict_weights_epoch_' + str(epo) + '.h5', overwrite=True)

    elif mode == 'predict':
        # load the evaluation data
        data = pickle.load(open("./data/dev.pkl",'rb'))
        random.shuffle(data)

        # load weights from trained model
        qa_data = QAData()
        model_filenames = ['model/best_model.h5', 'model/predict_weights_epoch_' + str(epo) + '.h5']

        for model_name in model_filenames:
            predict_model.load_weights(model_name)

            c = 0
            c1 = 0
            for i, d in enumerate(data):
                if i%100 == 0:
                    print(i, len(data))

                # pad the data and get it in desired format
                indices, answers, question = qa_data.process_data(d)

                # get the similarity score
                sims = predict_model.predict([question, answers])

                n_good = len(d['good'])
                max_r = np.argmax(sims)
                max_n = np.argmax(sims[:n_good])
                r = rankdata(sims, method='max')
                c += 1 if max_r == max_n else 0
                c1 += 1 / float(r[max_r] - r[max_n] + 1)

            precision = c / float(len(data))
            mrr = c1 / float(len(data))
            print(f'Results for: model: {model_name}')
            print("Precision", precision)
            print("MRR", mrr)