| import os |
| import argparse |
| import logging |
| import json |
| import torch |
| |
| import numpy as np |
| import scipy.misc |
| from io import BytesIO |
|
|
|
|
| from core import TransE, DistMult, ComplEx |
|
|
| FALSY_STRINGS = {'off', 'false', '0'} |
| TRUTHY_STRINGS = {'on', 'true', '1'} |
|
|
| MAIN_DIR = os.path.relpath(os.path.dirname(os.path.abspath(__file__))) |
| DATA_PATH = os.path.join(MAIN_DIR, 'data/FB15K') |
| TRAIN_DATA_PATH = os.path.join(DATA_PATH, 'train2id.txt') |
| VALID_DATA_PATH = os.path.join(DATA_PATH, 'valid2id.txt') |
| TEST_DATA_PATH = os.path.join(DATA_PATH, 'test2id.txt') |
| ALL_DATA_PATH = os.path.join(DATA_PATH, 'triple2id.txt') |
|
|
|
|
| def bool_flag(s): |
| """ |
| Parse boolean arguments from the command line. |
| """ |
| if s.lower() in FALSY_STRINGS: |
| return False |
| elif s.lower() in TRUTHY_STRINGS: |
| return True |
| else: |
| raise argparse.ArgumentTypeError("invalid value for a boolean flag. use 0 or 1") |
|
|
|
|
| def initialize_experiment(params): |
| params.main_dir = os.path.relpath(os.path.dirname(os.path.abspath(__file__))) |
| exps_dir = os.path.join(params.main_dir, 'experiments') |
| if not os.path.exists(exps_dir): |
| os.makedirs(exps_dir) |
|
|
| params.exp_dir = os.path.join(exps_dir, params.experiment_name) |
|
|
| if not os.path.exists(params.exp_dir): |
| os.makedirs(params.exp_dir) |
|
|
| file_handler = logging.FileHandler(os.path.join(params.exp_dir, "log.txt")) |
| logger = logging.getLogger() |
| logger.addHandler(file_handler) |
|
|
| logger.info('============ Initialized logger ============') |
| logger.info('\n'.join('%s: %s' % (k, str(v)) for k, v |
| in sorted(dict(vars(params)).items()))) |
| logger.info('============================================') |
|
|
| with open(os.path.join(params.exp_dir, "params.json"), 'w') as fout: |
| json.dump(vars(params), fout) |
|
|
|
|
| def initialize_model(params, load_model=False): |
|
|
| if load_model and os.path.exists(os.path.join(params.exp_dir, 'best_model.pth')): |
| logging.info('Loading existing model from %s' % os.path.join(params.exp_dir, 'best_model.pth')) |
| model = torch.load(os.path.join(params.exp_dir, 'best_model.pth')) |
| else: |
| logging.info('No existing model found. Initializing new model..') |
| if params.model == 'TransE': |
| model = TransE(params).to(device=params.device) |
| if params.model == 'DistMult': |
| model = DistMult(params).to(device=params.device) |
| if params.model == 'ComplEx': |
| model = ComplEx(params).to(device=params.device) |
|
|
| return model |
|
|
| |
|
|
|
|
| |
|
|
| |
| |
| |
|
|
| |
| |
| |
| |
|
|
| |
| |
|
|
| |
| |
| |
| |
|
|
| |
| |
| |
| |
| |
| |
|
|
| |
| |
| |
|
|
| |
| |
|
|
| |
| |
|
|
| |
| |
| |
| |
| |
| |
| |
|
|
| |
| |
|
|
| |
| |
| |
| |
| |
|
|
| |
| |
| |
| |
|
|