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
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
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
@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]
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)