diff --git a/sqlnet/model/modules/aggregator_predict.py b/sqlnet/model/modules/aggregator_predict.py index 047d2ea..87a555a 100644 --- a/sqlnet/model/modules/aggregator_predict.py +++ b/sqlnet/model/modules/aggregator_predict.py @@ -4,7 +4,7 @@ import torch.nn.functional as F from torch.autograd import Variable import numpy as np -from net_utils import run_lstm, col_name_encode +from sqlnet.model.modules.net_utils import run_lstm, col_name_encode @@ -17,13 +17,13 @@ def __init__(self, N_word, N_h, N_depth, use_ca): num_layers=N_depth, batch_first=True, dropout=0.3, bidirectional=True) if use_ca: - print "Using column attention on aggregator predicting" + print("Using column attention on aggregator predicting"); self.agg_col_name_enc = nn.LSTM(input_size=N_word, hidden_size=N_h/2, num_layers=N_depth, batch_first=True, dropout=0.3, bidirectional=True) self.agg_att = nn.Linear(N_h, N_h) else: - print "Not using column attention on aggregator predicting" + print("Not using column attention on aggregator predicting"); self.agg_att = nn.Linear(N_h, 1) self.agg_out = nn.Sequential(nn.Linear(N_h, N_h), nn.Tanh(), nn.Linear(N_h, 6)) diff --git a/sqlnet/model/modules/selection_predict.py b/sqlnet/model/modules/selection_predict.py index 73d8a6a..2ba9abd 100644 --- a/sqlnet/model/modules/selection_predict.py +++ b/sqlnet/model/modules/selection_predict.py @@ -4,7 +4,7 @@ import torch.nn.functional as F from torch.autograd import Variable import numpy as np -from net_utils import run_lstm, col_name_encode +from sqlnet.model.modules.net_utils import run_lstm, col_name_encode class SelPredictor(nn.Module): def __init__(self, N_word, N_h, N_depth, max_tok_num, use_ca): @@ -15,10 +15,10 @@ def __init__(self, N_word, N_h, N_depth, max_tok_num, use_ca): num_layers=N_depth, batch_first=True, dropout=0.3, bidirectional=True) if use_ca: - print "Using column attention on selection predicting" + print("Using column attention on selection predicting"); self.sel_att = nn.Linear(N_h, N_h) else: - print "Not using column attention on selection predicting" + print("Not using column attention on selection predicting"); self.sel_att = nn.Linear(N_h, 1) self.sel_col_name_enc = nn.LSTM(input_size=N_word, hidden_size=N_h/2, num_layers=N_depth, batch_first=True, diff --git a/sqlnet/model/modules/seq2sql_condition_predict.py b/sqlnet/model/modules/seq2sql_condition_predict.py index 4bb34ba..fa585e3 100644 --- a/sqlnet/model/modules/seq2sql_condition_predict.py +++ b/sqlnet/model/modules/seq2sql_condition_predict.py @@ -4,12 +4,12 @@ import torch.nn.functional as F from torch.autograd import Variable import numpy as np -from net_utils import run_lstm +from sqlnet.model.modules.net_utils import run_lstm class Seq2SQLCondPredictor(nn.Module): def __init__(self, N_word, N_h, N_depth, max_col_num, max_tok_num, gpu): super(Seq2SQLCondPredictor, self).__init__() - print "Seq2SQL where prediction" + print("Seq2SQL where prediction"); self.N_h = N_h self.max_tok_num = max_tok_num self.max_col_num = max_col_num diff --git a/sqlnet/model/modules/sqlnet_condition_predict.py b/sqlnet/model/modules/sqlnet_condition_predict.py index 1eb5500..c5c5ede 100644 --- a/sqlnet/model/modules/sqlnet_condition_predict.py +++ b/sqlnet/model/modules/sqlnet_condition_predict.py @@ -4,7 +4,7 @@ import torch.nn.functional as F from torch.autograd import Variable import numpy as np -from net_utils import run_lstm, col_name_encode +from sqlnet.model.modules.net_utils import run_lstm, col_name_encode class SQLNetCondPredictor(nn.Module): def __init__(self, N_word, N_h, N_depth, max_col_num, max_tok_num, use_ca, gpu): @@ -32,10 +32,10 @@ def __init__(self, N_word, N_h, N_depth, max_col_num, max_tok_num, use_ca, gpu): num_layers=N_depth, batch_first=True, dropout=0.3, bidirectional=True) if use_ca: - print "Using column attention on where predicting" + print("Using column attention on where predicting"); self.cond_col_att = nn.Linear(N_h, N_h) else: - print "Not using column attention on where predicting" + print("Not using column attention on where predicting"); self.cond_col_att = nn.Linear(N_h, 1) self.cond_col_name_enc = nn.LSTM(input_size=N_word, hidden_size=N_h/2, num_layers=N_depth, batch_first=True, diff --git a/sqlnet/model/modules/word_embedding.py b/sqlnet/model/modules/word_embedding.py index b41a0a7..c000b7a 100644 --- a/sqlnet/model/modules/word_embedding.py +++ b/sqlnet/model/modules/word_embedding.py @@ -16,14 +16,14 @@ def __init__(self, word_emb, N_word, gpu, SQL_TOK, self.SQL_TOK = SQL_TOK if trainable: - print "Using trainable embedding" + print("Using trainable embedding") self.w2i, word_emb_val = word_emb self.embedding = nn.Embedding(len(self.w2i), N_word) self.embedding.weight = nn.Parameter( torch.from_numpy(word_emb_val.astype(np.float32))) else: self.word_emb = word_emb - print "Using fixed embedding" + print("Using fixed embedding"); def gen_x_batch(self, q, col): diff --git a/sqlnet/model/seq2sql.py b/sqlnet/model/seq2sql.py index 651a4ea..6c4668e 100644 --- a/sqlnet/model/seq2sql.py +++ b/sqlnet/model/seq2sql.py @@ -4,10 +4,10 @@ import torch.nn.functional as F from torch.autograd import Variable import numpy as np -from modules.word_embedding import WordEmbedding -from modules.aggregator_predict import AggPredictor -from modules.selection_predict import SelPredictor -from modules.seq2sql_condition_predict import Seq2SQLCondPredictor +from sqlnet.model.modules.word_embedding import WordEmbedding +from sqlnet.model.modules.aggregator_predict import AggPredictor +from sqlnet.model.modules.selection_predict import SelPredictor +from sqlnet.model.modules.seq2sql_condition_predict import Seq2SQLCondPredictor # This is a re-implementation based on the following paper: @@ -199,9 +199,9 @@ def reinforce_backward(self, score, rewards): def check_acc(self, vis_info, pred_queries, gt_queries, pred_entry): def pretty_print(vis_data): - print 'question:', vis_data[0] - print 'headers: (%s)'%(' || '.join(vis_data[1])) - print 'query:', vis_data[2] + print('question:', vis_data[0]); + print('headers: (%s)'%(' || '.join(vis_data[1]))); + print('query:', vis_data[2]); def gen_cond_str(conds, header): if len(conds) == 0: @@ -349,7 +349,7 @@ def merge_tokens(tok_list, raw_tok_str): cond_toks.append(cond_val) if verbose: - print cond_toks + print(cond_toks); if len(cond_toks) > 0: cond_toks = cond_toks[1:] st = 0 diff --git a/sqlnet/model/sqlnet.py b/sqlnet/model/sqlnet.py index 7c3ebb4..2206ba4 100644 --- a/sqlnet/model/sqlnet.py +++ b/sqlnet/model/sqlnet.py @@ -4,10 +4,10 @@ import torch.nn.functional as F from torch.autograd import Variable import numpy as np -from modules.word_embedding import WordEmbedding -from modules.aggregator_predict import AggPredictor -from modules.selection_predict import SelPredictor -from modules.sqlnet_condition_predict import SQLNetCondPredictor +from sqlnet.model.modules.word_embedding import WordEmbedding +from sqlnet.model.modules.aggregator_predict import AggPredictor +from sqlnet.model.modules.selection_predict import SelPredictor +from sqlnet.model.modules.sqlnet_condition_predict import SQLNetCondPredictor class SQLNet(nn.Module): @@ -231,9 +231,9 @@ def loss(self, score, truth_num, pred_entry, gt_where): def check_acc(self, vis_info, pred_queries, gt_queries, pred_entry): def pretty_print(vis_data): - print 'question:', vis_data[0] - print 'headers: (%s)'%(' || '.join(vis_data[1])) - print 'query:', vis_data[2] + print('question:', vis_data[0]) + print('headers: (%s)'%(' || '.join(vis_data[1]))) + print('query:', vis_data[2]) def gen_cond_str(conds, header): if len(conds) == 0: diff --git a/sqlnet/utils.py b/sqlnet/utils.py index 2311671..ea0ea80 100644 --- a/sqlnet/utils.py +++ b/sqlnet/utils.py @@ -1,5 +1,5 @@ import json -from lib.dbengine import DBEngine +from sqlnet.lib.dbengine import DBEngine import re import numpy as np #from nltk.tokenize import StanfordTokenizer @@ -14,7 +14,7 @@ def load_data(sql_paths, table_paths, use_small=False): max_col_num = 0 for SQL_PATH in sql_paths: - print "Loading data from %s"%SQL_PATH + print("Loading data from %s"%SQL_PATH); with open(SQL_PATH) as inf: for idx, line in enumerate(inf): if use_small and idx >= 1000: @@ -23,7 +23,7 @@ def load_data(sql_paths, table_paths, use_small=False): sql_data.append(sql) for TABLE_PATH in table_paths: - print "Loading data from %s"%TABLE_PATH + print("Loading data from %s"%TABLE_PATH); with open(TABLE_PATH) as inf: for line in inf: tab = json.loads(line.strip()) @@ -36,7 +36,7 @@ def load_data(sql_paths, table_paths, use_small=False): def load_dataset(dataset_id, use_small=False): if dataset_id == 0: - print "Loading from original dataset" + print("Loading from original dataset"); sql_data, table_data = load_data('data/train_tok.jsonl', 'data/train_tok.tables.jsonl', use_small=use_small) val_sql_data, val_table_data = load_data('data/dev_tok.jsonl', @@ -47,7 +47,7 @@ def load_dataset(dataset_id, use_small=False): DEV_DB = 'data/dev.db' TEST_DB = 'data/test.db' else: - print "Loading from re-split dataset" + print("Loading from re-split dataset"); sql_data, table_data = load_data('data_resplit/train.jsonl', 'data_resplit/tables.jsonl', use_small=use_small) val_sql_data, val_table_data = load_data('data_resplit/dev.jsonl', diff --git a/train.py b/train.py index ed0cab5..2c30078 100644 --- a/train.py +++ b/train.py @@ -9,22 +9,22 @@ import argparse if __name__ == '__main__': - parser = argparse.ArgumentParser() + parser = argparse.ArgumentParser(); parser.add_argument('--toy', action='store_true', - help='If set, use small data; used for fast debugging.') + help='If set, use small data; used for fast debugging.'); parser.add_argument('--suffix', type=str, default='', - help='The suffix at the end of saved model name.') + help='The suffix at the end of saved model name.'); parser.add_argument('--ca', action='store_true', - help='Use conditional attention.') + help='Use conditional attention.'); parser.add_argument('--dataset', type=int, default=0, - help='0: original dataset, 1: re-split dataset') + help='0: original dataset, 1: re-split dataset'); parser.add_argument('--rl', action='store_true', - help='Use RL for Seq2SQL(requires pretrained model).') + help='Use RL for Seq2SQL(requires pretrained model).'); parser.add_argument('--baseline', action='store_true', - help='If set, then train Seq2SQL model; default is SQLNet model.') + help='If set, then train Seq2SQL model; default is SQLNet model.'); parser.add_argument('--train_emb', action='store_true', - help='Train word embedding for SQLNet(requires pretrained model).') - args = parser.parse_args() + help='Train word embedding for SQLNet(requires pretrained model).'); + args = parser.parse_args(); N_word=300 B_word=42 @@ -66,38 +66,38 @@ if args.rl or args.train_emb: # Load pretrained model. agg_lm, sel_lm, cond_lm = best_model_name(args, for_load=True) - print "Loading from %s"%agg_lm + print("Loading from %s"%agg_lm); model.agg_pred.load_state_dict(torch.load(agg_lm)) - print "Loading from %s"%sel_lm + print("Loading from %s"%sel_lm); model.sel_pred.load_state_dict(torch.load(sel_lm)) - print "Loading from %s"%cond_lm + print("Loading from %s"%cond_lm); model.cond_pred.load_state_dict(torch.load(cond_lm)) if args.rl: best_acc = 0.0 best_idx = -1 - print "Init dev acc_qm: %s\n breakdown on (agg, sel, where): %s"% \ + print("Init dev acc_qm: %s\n breakdown on (agg, sel, where): %s"% \ epoch_acc(model, BATCH_SIZE, val_sql_data,\ - val_table_data, TRAIN_ENTRY) - print "Init dev acc_ex: %s"%epoch_exec_acc( - model, BATCH_SIZE, val_sql_data, val_table_data, DEV_DB) + val_table_data, TRAIN_ENTRY)); + print("Init dev acc_ex: %s"%epoch_exec_acc( + model, BATCH_SIZE, val_sql_data, val_table_data, DEV_DB)); torch.save(model.cond_pred.state_dict(), cond_m) for i in range(100): - print 'Epoch %d @ %s'%(i+1, datetime.datetime.now()) - print ' Avg reward = %s'%epoch_reinforce_train( - model, optimizer, BATCH_SIZE, sql_data, table_data, TRAIN_DB) - print ' dev acc_qm: %s\n breakdown result: %s'% epoch_acc( - model, BATCH_SIZE, val_sql_data, val_table_data, TRAIN_ENTRY) + print('Epoch %d @ %s'%(i+1, datetime.datetime.now())); + print(' Avg reward = %s'%epoch_reinforce_train( + model, optimizer, BATCH_SIZE, sql_data, table_data, TRAIN_DB)); + print(' dev acc_qm: %s\n breakdown result: %s'% epoch_acc( + model, BATCH_SIZE, val_sql_data, val_table_data, TRAIN_ENTRY)); exec_acc = epoch_exec_acc( model, BATCH_SIZE, val_sql_data, val_table_data, DEV_DB) - print ' dev acc_ex: %s', exec_acc + print(' dev acc_ex: %s', exec_acc); if exec_acc[0] > best_acc: best_acc = exec_acc[0] best_idx = i+1 torch.save(model.cond_pred.state_dict(), 'saved_model/epoch%d.cond_model%s'%(i+1, args.suffix)) torch.save(model.cond_pred.state_dict(), cond_m) - print ' Best exec acc = %s, on epoch %s'%(best_acc, best_idx) + print(' Best exec acc = %s, on epoch %s'%(best_acc, best_idx)); else: init_acc = epoch_acc(model, BATCH_SIZE, val_sql_data, val_table_data, TRAIN_ENTRY) @@ -107,8 +107,8 @@ best_sel_idx = 0 best_cond_acc = init_acc[1][2] best_cond_idx = 0 - print 'Init dev acc_qm: %s\n breakdown on (agg, sel, where): %s'%\ - init_acc + print('Init dev acc_qm: %s\n breakdown on (agg, sel, where): %s'%\ + init_acc); if TRAIN_AGG: torch.save(model.agg_pred.state_dict(), agg_m) if args.train_emb: @@ -122,16 +122,16 @@ if args.train_emb: torch.save(model.cond_embed_layer.state_dict(), cond_e) for i in range(100): - print 'Epoch %d @ %s'%(i+1, datetime.datetime.now()) - print ' Loss = %s'%epoch_train( + print('Epoch %d @ %s'%(i+1, datetime.datetime.now())); + print(' Loss = %s'%epoch_train( model, optimizer, BATCH_SIZE, - sql_data, table_data, TRAIN_ENTRY) - print ' Train acc_qm: %s\n breakdown result: %s'%epoch_acc( - model, BATCH_SIZE, sql_data, table_data, TRAIN_ENTRY) + sql_data, table_data, TRAIN_ENTRY)); + print (' Train acc_qm: %s\n breakdown result: %s'%epoch_acc( + model, BATCH_SIZE, sql_data, table_data, TRAIN_ENTRY)); #val_acc = epoch_token_acc(model, BATCH_SIZE, val_sql_data, val_table_data, TRAIN_ENTRY) val_acc = epoch_acc(model, BATCH_SIZE, val_sql_data, val_table_data, TRAIN_ENTRY) - print ' Dev acc_qm: %s\n breakdown result: %s'%val_acc + print(' Dev acc_qm: %s\n breakdown result: %s'%val_acc); if TRAIN_AGG: if val_acc[1][0] > best_agg_acc: best_agg_acc = val_acc[1][0] @@ -165,6 +165,6 @@ torch.save(model.cond_embed_layer.state_dict(), 'saved_model/epoch%d.cond_embed%s'%(i+1, args.suffix)) torch.save(model.cond_embed_layer.state_dict(), cond_e) - print ' Best val acc = %s, on epoch %s individually'%( + print(' Best val acc = %s, on epoch %s individually'%( (best_agg_acc, best_sel_acc, best_cond_acc), - (best_agg_idx, best_sel_idx, best_cond_idx)) + (best_agg_idx, best_sel_idx, best_cond_idx)))