def parse_and_preprocess_src(data_source, corpus_destination, preprocess=True):
    if re.search("bundestag", data_source.lower()):
        name = "bundestag"
        raw_corpus = DataHandler.get_bundestag_speeches(directory=data_source)
    elif re.search("sustainability", data_source.lower()):
        name = "sustainability"
        raw_corpus = DataHandler.get_sustainability_data(path=data_source)
    elif re.search("unv1.0-tei", data_source.lower()):
        name = "united_nations"
        raw_corpus = DataHandler.get_un_texts(directory=data_source)
    elif re.search("state_of_the_union", data_source.lower()):
        name = "state_of_the_union"
        raw_corpus = DataHandler.get_state_of_the_union(directory=data_source)
    else:
        name = "abstracts"
        raw_corpus = DataHandler.get_abstracts(path=data_source)

    language = raw_corpus[0].language
    print('loaded', len(raw_corpus), 'documents')
    if preprocess:
        Preprocessor.preprocess(raw_corpus, language=language)
        print('preprocessed', len(raw_corpus), 'documents')
    corpus = Corpus(source=raw_corpus, language=language, name=name)
    print('parsed', len(corpus.get_documents(as_list=True)),
          'documents to a Corpus')
    corpus.save_corpus(corpus_destination)
示例#2
0
	def load_portfolio(self) -> dict:
		"""
		Loads portfolio into the class checking first if the portfolio exists.
		:return: dict
		"""
		if DataHandler.check_portfolio_exists():
			return DataHandler.load_portfolio()
		else:
			return dict({})
示例#3
0
 def __init__(self, cfg):
     self.cfg = cfg
     self.cat_features = self.cfg.data.features.cat_features
     self.oof = None
     self.raw_preds = None
     self.weights = []
     self.models = []
     self.scores = []
     self.feature_importance_df = pd.DataFrame(
         columns=['feature', 'importance'])
     self.dh = DataHandler()
示例#4
0
 def __getitem__(self, index):
     if self.st == 'train' or self.st == 'FTrain':
         # index_sec = int(self.rng.rand()*self.len)
         # print(os.getpid(), index_sec)  # same in diff gpu
         # label = np.zeros(self.person)
         # label_sec = np.zeros(self.person)
         # label[self.y[index]] = 1
         # label_sec[self.y[index_sec]] = 1
         label = self.y[index]
         image = np.array(cv2.imread(self.name[index]), dtype=float)
         # image_sec = np.array(cv2.imread(self.name[index_sec]), dtype=float).copy()
         # image, label = aug.run2(image, label, image_sec, label_sec)
         image = Aug.run(self.rng, image)
         image = torch.from_numpy(image).float()
         # label = torch.from_numpy(label).float()
         return image, label
     elif self.st == 'test':
         size = (MinS + MaxS) // 2
         idx = (size - W) // 2
         image = np.array(self.dataset[index], dtype=float).copy()
         image = cv2.resize(image, (size, size))
         image = image[idx:idx + H, idx:idx + W, :]
         image = np.transpose(image, [2, 0, 1])
         image_flip = image.copy()[:, :, ::-1]
         image = torch.from_numpy((image - 127.5) / 128).float()
         image_flip = torch.from_numpy((image_flip - 127.5) / 128).float()
         label = np.zeros(self.len)
         label[self.y[index]] = 1
         label = torch.from_numpy(label).float()
         return image, image_flip, label, self.name[index]
     else:
         exit(-1)
示例#5
0
def save_features(df, data_type='train'):
    save_path = Path('../configs/feature/all.yml')
    dh = DataHandler()

    if not save_path.exists():
        save_path.touch()
        feature_dict = {'features': []}
    else:
        feature_dict = dh.load(save_path)

    new_feature = sorted(set(feature_dict['features'] + df.columns.tolist()))
    feature_dict['features'] = new_feature
    dh.save(save_path, feature_dict)

    for col in df.columns:
        df[[col]].reset_index(drop=True).to_feather(f'../features/{col}_{data_type}.feather')
示例#6
0
 def on_ok(self):
     if len(current_portoflio.portfolio) == 6:
         self.status_msg.value = "Max 6 stocks allowed. Please purchase premium version!"
     else:
         last_price = StockDataReader.last_price(
             StockDataReader.get_data(self.symbol.value))
         validation = DataHandler.validate_entry(self.symbol.value,
                                                 self.date.value,
                                                 self.amount.value,
                                                 self.price.value,
                                                 last_price)
         if validation != True:
             self.status_msg.value = validation
             self.display()
         else:
             current_portoflio.add_stock(self.symbol.value,
                                         float(self.price.value),
                                         float(self.amount.value),
                                         self.date.value)
             self.status_msg.value = f"Grabbing data for {self.symbol.value}"
             to_main = self.parentApp.getForm('MAIN')
             to_main.load_portfolio()
             to_main.load_performance()
             to_main.top_message.value = "Portfolio:"
             self.display()
             sleep(1.5)
             self.parentApp.switchForm("MAIN")
示例#7
0
    def __init__(self, params):

        # Build data handler
        self.data_handler = DataHandler()
        self.data_handler.loadData(params['input'])
        params['inp_dim'] = self.data_handler.getDataShape()[1]
        logging.info("=" * 41)

        # Build model
        self.model = SPINEModel(params)
        self.dtype = torch.FloatTensor
        use_cuda = torch.cuda.is_available()
        if use_cuda:
            self.model.cuda()
            self.dtype = torch.cuda.FloatTensor
        self.optimizer = torch.optim.SGD(self.model.parameters(), lr=0.1)
        logging.info("=" * 41)
示例#8
0
    def create(self):
        # ====================== Init portfolio ========================
        self.welcome_msg = self.add(npyscreen.FixedText, value=welcome, rely=2)
        self.welcome_msg2 = self.add(npyscreen.FixedText,
                                     value=welcome_line2,
                                     rely=3)
        self.top_message = self.add(npyscreen.FixedText,
                                    value="",
                                    relx=8,
                                    rely=4)

        # ====================== End init portfolio ====================

        # ====================== Menu section ==========================
        self.menu = self.new_menu(name="Main Menu", shortcut="m")
        self.menu.addItem("1. Add stock to portfolio", self.change_form_add,
                          "1")
        self.menu.addItem("2. Update Portfolio", self.change_form_update, "2")
        self.menu.addItem("3. Save performance to PDF",
                          self.change_form_save_pdf, "3")
        self.menu.addItem("4. Delete Stock form portfolio",
                          self.change_form_delete, "4")
        # ====================== End menu section ======================

        self.add(npyscreen.FixedText, value="Performance:", relx=8, rely=26)

        self.main_ii = self.add(
            npyscreen.FixedText,
            value=f"Initial Investment: ${self.initial_investment}",
            relx=8,
            rely=27)
        self.main_rd = self.add(
            npyscreen.FixedText,
            value=f"Returned Amount: ${self.return_dollar}",
            relx=8,
            rely=28)
        self.main_pr = self.add(npyscreen.FixedText,
                                value=f"Returned Percent: {self.pct_return}%",
                                relx=8,
                                rely=29)

        self.exit_button = self.add(npyscreen.ButtonPress,
                                    name="Exit",
                                    rely=29,
                                    relx=106,
                                    when_pressed_function=self.exit_press)
        if not DataHandler.check_portfolio_exists():
            self.top_message.value = no_portfolio_msg
        else:
            self.top_message.value = "Portfolio:"
            self.load_portfolio()
            self.load_performance()
示例#9
0
    def __init__(self, params):

        # Build data handler
        self.data_handler = DataHandler()
        self.data_handler.loadData(params['input'])
        params['inp_dim'] = self.data_handler.getDataShape()[1]
        logging.info("=" * 41)

        # Build model
        self.model = SPINEModel(params)
        self.dtype = torch.FloatTensor
        use_cuda = torch.cuda.is_available()
        if use_cuda:
            self.model.cuda()
            self.dtype = torch.cuda.FloatTensor
        # Select optimizer
        optim_selected = params['optim']
        LR = 0.1
        if optim_selected == 'sgd':
            self.optimizer = torch.optim.SGD(self.model.parameters(), lr=LR)
        elif optim_selected == 'adam':
            self.optimizer = torch.optim.Adam(self.model.parameters(), lr=LR)
        logging.info("=" * 41)
示例#10
0
    def __init__(self, params):

        # build data handler
        self.data_handler = DataHandler()
        self.data_handler.loadData(params['input'])
        params['inp_dim'] = self.data_handler.getDataShape()[1]

        print("=" * 41)

        # build model
        self.model = SPINEModel(params)
        self.dtype = torch.FloatTensor

        # check if GPU is available
        use_cuda = torch.cuda.is_available()
        if use_cuda:
            self.model.cuda()
            self.dtype = torch.cuda.FloatTensor

        # set optimizer
        self.optimizer = torch.optim.SGD(self.model.parameters(), lr=0.1)

        print("=" * 41)
示例#11
0
    def __init__(self, net, state, loop_sleep, pause_after_keys, heartbeat_required):
        CodependentThread.__init__(self, heartbeat_required)
        self.daemon = True
        self.net = net
        self.input_dims = self.net.blobs['data'].data.shape[2:4]    # e.g. (227,227)
        self.state = state
        self.frames_processed_fwd = 0
        self.frames_processed_back = 0
        self.loop_sleep = loop_sleep
        self.pause_after_keys = pause_after_keys
        self.debug_level = 0
        self.descriptor = None
        self.descriptor_layer_1 = 'conv5'
        self.descriptor_layer_2 = 'conv4'
        self.descriptor_layers = ['conv5','conv4']
        self.net_input_image = None
        self.descriptor_handler = DescriptorHandler(self.state.settings.ros_dir + '/models/memory/', self.descriptor_layers)
        self.data_handler = DataHandler(self.state.settings.ros_dir)
        self.available_layer = ['conv1', 'pool1', 'norm1', 'conv2', 'pool2', 'norm2', 'conv3', 'conv4', 'conv5', 'pool5', 'fc6', 'fc7', 'fc8', 'prob']
        #['conv1', 'conv2', 'conv3', 'conv4', 'conv5', 'fc6', 'fc7', 'fc8', 'prob']
        # print "layers ", list(self.net._layer_names)

        s = rospy.Service('get_cnn_state', GetState, self.handle_get_cnn_state)
示例#12
0
def main():
    images_dir = 'images'
    output_dir = 'output'
    debug = True

    for image_idx, (reference_image, inspection_image) in enumerate(
            DataHandler(images_dir).get()):
        detector = DefectDetector(reference_image,
                                  inspection_image,
                                  image_idx,
                                  debug=debug,
                                  output_dir=output_dir)
        output_mask = detector.run()
        plt.imsave(os.path.join(output_dir,
                                'output-image-idx-{}.png'.format(image_idx)),
                   output_mask,
                   cmap=cm.gray)
示例#13
0
import sys
import pandas as pd
from easydict import EasyDict as edict

sys.path.append('../src')
from utils import DataHandler
from feature_utils import save_features

dh = DataHandler()


def get_features(df):
    features_df = pd.DataFrame()

    features_df['one_hot_sex'] = df['sex'].map({'male': 0, 'female': 1})

    age_df = pd.get_dummies(df['age_approx'])
    for col in age_df.columns:
        features_df[f'one_hot_age_{col}'] = age_df[col]

    site_df = pd.get_dummies(df['anatom_site_general_challenge'])
    for col in site_df.columns:
        features_df[f'one_hot_site_{col.replace("/", "-")}'] = site_df[col]

    return features_df


def main():
    train_df = dh.load('../data/input/train_concated.csv')
    test_df = dh.load('../data/input/test.csv')
示例#14
0
from utils import (DataHandler, Notificator, Timer, seed_everything, Git,
                   Kaggle, reduce_mem_usage)

warnings.filterwarnings('ignore')

# ===============
# Settings
# ===============
parser = argparse.ArgumentParser()
parser.add_argument('--common', default='../configs/common/compe.yml')
parser.add_argument('--notify', default='../configs/common/notify.yml')
parser.add_argument('-m', '--model')
parser.add_argument('-c', '--comment')
options = parser.parse_args()

dh = DataHandler()
cfg = dh.load(options.common)
cfg.update(dh.load(f'../configs/exp/{options.model}.yml'))

notify_params = dh.load(options.notify)

features_params = dh.load(f'../configs/feature/{cfg.data.features.name}.yml')
features = features_params.features

comment = options.comment
model_name = options.model
now = datetime.datetime.now()
if cfg.model.task_type != 'optuna':
    run_name = f'{model_name}_{now:%Y%m%d%H%M%S}'
else:
    run_name = f'{model_name}_optuna_{now:%Y%m%d%H%M%S}'
示例#15
0
    def build_data_set(self, root_dir: str):
        entries = self.parse_folder(root_dir)

        data_handler = DataHandler()
        icd10_ontology = data_handler.read_icd10_ontology()
        group_codes = set(data_handler.read_reduced_icd10_ontology().keys())

        de_entries = dict()
        en_entries = dict()
        for entry in entries:
            if "de_" + entry[0] in de_entries:
                continue

            icd10_codes = entry[3]

            valid_group_codes = set()
            main_chapter = ""

            for code in icd10_codes:
                if code in icd10_chapter_mappings:
                    code = icd10_chapter_mappings[code]

                if not code in icd10_ontology and "." in code:
                    code = code[:code.index(".")]

                if not code in icd10_ontology:
                    self.logger.error(
                        f"Can't find code {code} in ICD10 ontology")
                    continue

                path_components = icd10_ontology[code].split("#")
                if main_chapter == "":
                    main_chapter = path_components[0]

                for path_comp in path_components:
                    if path_comp in group_codes:
                        valid_group_codes.add(path_comp)

            valid_group_codes = "|".join(valid_group_codes)

            de_entries["de_" + entry[0]] = {
                "text": entry[1],
                "language": "de",
                "all_labels": valid_group_codes,
                "main_chapter": main_chapter
            }
            en_entries["en_" + entry[0]] = {
                "text": entry[2],
                "language": "en",
                "all_labels": valid_group_codes,
                "main_chapter": main_chapter
            }

        de_df = DataFrame.from_dict(de_entries, orient="index")
        en_df = DataFrame.from_dict(en_entries, orient="index")

        de_train, de_dev = train_test_split(de_df,
                                            train_size=0.8,
                                            stratify=de_df["main_chapter"])
        de_train["data_set"] = "train"
        de_dev["data_set"] = "dev"
        de_df = de_train.append(de_dev)

        en_train, en_dev = train_test_split(en_df,
                                            train_size=0.8,
                                            stratify=en_df["main_chapter"])
        en_train["data_set"] = "train"
        en_dev["data_set"] = "dev"
        en_df = en_train.append(en_dev)

        full_df = de_df.append(en_df)
        full_df = full_df.drop_duplicates()
        full_df = full_df[full_df["text"].notna()]

        #de_df.to_csv("drks_de.tsv", sep="\t", columns=["data_set", "main_chapter", "all_labels", "text"], index_label="id")
        #en_df.to_csv("drks_en.tsv", sep="\t", columns=["data_set", "main_chapter", "all_labels", "text"], index_label="id")

        output_dir = "data/drks/prepared"
        os.makedirs(output_dir, exist_ok=True)

        output_file = os.path.join(output_dir, "drks_full.tsv")
        full_df.to_csv(output_file,
                       sep="\t",
                       columns=[
                           "language", "data_set", "main_chapter",
                           "all_labels", "text"
                       ],
                       index_label="id")
示例#16
0
class Solver:
    def __init__(self, params):

        # build data handler
        self.data_handler = DataHandler()
        self.data_handler.loadData(params['input'])
        params['inp_dim'] = self.data_handler.getDataShape()[1]

        print("=" * 41)

        # build model
        self.model = SPINEModel(params)
        self.dtype = torch.FloatTensor

        # check if GPU is available
        use_cuda = torch.cuda.is_available()
        if use_cuda:
            self.model.cuda()
            self.dtype = torch.cuda.FloatTensor

        # set optimizer
        self.optimizer = torch.optim.SGD(self.model.parameters(), lr=0.1)

        print("=" * 41)

    def train(self, params):
        num_epochs, batch_size = params['num_epochs'], params['batch_size'],
        optimizer = self.optimizer
        dtype = self.dtype

        # train for each epoch
        for iteration in range(num_epochs):
            self.data_handler.shuffleTrain()
            num_batches = self.data_handler.getNumberOfBatches(batch_size)
            epoch_losses = np.zeros(4)  # rl, asl, psl, total

            # for each batch
            for batch_idx in range(num_batches):
                optimizer.zero_grad()
                batch_x, batch_y = self.data_handler.getBatch(
                    batch_idx, batch_size, params['noise_level'],
                    params['denoising'])

                # transform batches into tensors
                batch_x = Variable(torch.from_numpy(batch_x),
                                   requires_grad=False).type(dtype)
                batch_y = Variable(torch.from_numpy(batch_y),
                                   requires_grad=False).type(dtype)

                # calculate losses
                out, h, loss, loss_terms = self.model(batch_x, batch_y)
                reconstruction_loss, psl_loss, asl_loss = loss_terms

                # update loss and optimizer
                loss.backward()
                optimizer.step()

                # assign loss
                epoch_losses[0] += reconstruction_loss.data
                epoch_losses[1] += asl_loss.data
                epoch_losses[2] += psl_loss.data
                epoch_losses[3] += loss.data
            print("epoch %r: Reconstruction Loss = %.4f, ASL = %.4f, "\
               "PSL = %.4f, and total = %.4f"
               %(iteration+1, epoch_losses[0], epoch_losses[1], epoch_losses[2], epoch_losses[3]) )

    def getSpineEmbeddings(self, batch_size, params):
        ret = []
        self.data_handler.resetDataOrder()
        num_batches = self.data_handler.getNumberOfBatches(batch_size)

        # for each batch
        for batch_idx in range(num_batches):
            batch_x, batch_y = self.data_handler.getBatch(
                batch_idx, batch_size, params['noise_level'],
                params['denoising'])

            # transform batches into tensors
            batch_x = Variable(torch.from_numpy(batch_x),
                               requires_grad=False).type(self.dtype)
            batch_y = Variable(torch.from_numpy(batch_y),
                               requires_grad=False).type(self.dtype)
            _, h, _, _ = self.model(batch_x, batch_y)

            # append to embeddings
            ret.extend(h.cpu().data.numpy())
        return np.array(ret)

    def getWordsList(self):
        return self.data_handler.getWordsList()
示例#17
0
class Solver:
    def __init__(self, params):

        # Build data handler
        self.data_handler = DataHandler()
        self.data_handler.loadData(params['input'])
        params['inp_dim'] = self.data_handler.getDataShape()[1]
        logging.info("=" * 41)

        # Build model
        self.model = SPINEModel(params)
        self.dtype = torch.FloatTensor
        use_cuda = torch.cuda.is_available()
        if use_cuda:
            self.model.cuda()
            self.dtype = torch.cuda.FloatTensor
        # Select optimizer
        optim_selected = params['optim']
        LR = 0.1
        if optim_selected == 'sgd':
            self.optimizer = torch.optim.SGD(self.model.parameters(), lr=LR)
        elif optim_selected == 'adam':
            self.optimizer = torch.optim.Adam(self.model.parameters(), lr=LR)
        logging.info("=" * 41)

    def train(self, params):
        num_epochs, batch_size = params['num_epochs'], params['batch_size'],
        optimizer = self.optimizer
        dtype = self.dtype
        STEP_DENOM = 5
        scheduler = StepLR(optimizer,
                           step_size=math.ceil(num_epochs / STEP_DENOM),
                           gamma=0.3)
        for iteration in range(num_epochs):
            # lr adjusting
            scheduler.step()
            # start epoch
            self.data_handler.shuffleTrain()
            num_batches = self.data_handler.getNumberOfBatches(batch_size)
            epoch_losses = np.zeros(4)  # rl, asl, psl, total
            for batch_idx in range(num_batches):
                optimizer.zero_grad()
                batch_x, batch_y = self.data_handler.getBatch(
                    batch_idx, batch_size, params['noise_level'],
                    params['denoising'])
                batch_x = Variable(torch.from_numpy(batch_x),
                                   requires_grad=False).type(dtype)
                batch_y = Variable(torch.from_numpy(batch_y),
                                   requires_grad=False).type(dtype)
                out, h, loss, loss_terms = self.model(batch_x, batch_y)
                reconstruction_loss, psl_loss, asl_loss = loss_terms
                loss.backward()
                epoch_losses[0] += reconstruction_loss.data.item()
                epoch_losses[1] += asl_loss.data.item()
                epoch_losses[2] += psl_loss.data.item()
                epoch_losses[3] += loss.data.item()
                optimizer.step()

            print("After epoch %r, Reconstruction Loss = %.4f, ASL = %.4f, "
                  "PSL = %.4f, and total = %.4f" %
                  (iteration + 1, epoch_losses[0], epoch_losses[1],
                   epoch_losses[2], epoch_losses[3]))
            # logging.info("After epoch %r, Sparsity = %.1f"
            #			%(iteration+1, utils.compute_sparsity(h.cpu().data.numpy())))
            # break
            # break

    def getSpineEmbeddings(self, batch_size, params):
        ret = []
        self.data_handler.resetDataOrder()
        num_batches = self.data_handler.getNumberOfBatches(batch_size)
        for batch_idx in range(num_batches):
            batch_x, batch_y = self.data_handler.getBatch(
                batch_idx, batch_size, params['noise_level'],
                params['denoising'])
            batch_x = Variable(torch.from_numpy(batch_x),
                               requires_grad=False).type(self.dtype)
            batch_y = Variable(torch.from_numpy(batch_y),
                               requires_grad=False).type(self.dtype)
            _, h, _, _ = self.model(batch_x, batch_y)
            ret.extend(h.cpu().data.numpy())
        return np.array(ret)

    def getWordsList(self):
        return self.data_handler.getWordsList()
示例#18
0
def main():
    parser = argparse.ArgumentParser()

    ## Required parameters
    parser.add_argument(
        "--data_set",
        choices=DataHandler.ALL_DATA_SET_IDS,
        required=True,
        help=
        "The input data dir. Should contain the .tsv files (or other data files) for the task."
    )

    parser.add_argument(
        "--bert_model",
        default=None,
        type=str,
        required=True,
        help=
        "Bert pre-trained model selected in the list: bert-base-multilingual-uncased, "
        "bert-base-multilingual-cased")

    parser.add_argument(
        "--output_dir",
        default=None,
        type=str,
        required=True,
        help=
        "The output directory where the model predictions and checkpoints will be written."
    )

    parser.add_argument(
        "--additional_data_set",
        choices=DataHandler.ALL_DATA_SET_IDS,
        required=False,
        help="Additional data set to extend the basic training data set. "
        "Only training data will be used! No additional evaluation data!")

    ## Other parameters
    parser.add_argument(
        "--cache_dir",
        default="_cache",
        type=str,
        help=
        "Where do you want to store the pre-trained models downloaded from s3")
    parser.add_argument(
        "--max_seq_length",
        default=300,
        type=int,
        help=
        "The maximum total input sequence length after WordPiece tokenization. \n"
        "Sequences longer than this will be truncated, and sequences shorter \n"
        "than this will be padded.")
    parser.add_argument("--do_train",
                        action='store_true',
                        help="Whether to run training.")
    parser.add_argument("--do_eval",
                        action='store_true',
                        help="Whether to run eval on the dev set.")
    parser.add_argument("--do_test",
                        action='store_true',
                        help="Whether to run eval on the test set.")
    parser.add_argument(
        "--do_lower_case",
        action='store_true',
        help="Set this flag if you are using an uncased model.")
    parser.add_argument("--train_batch_size",
                        default=32,
                        type=int,
                        help="Total batch size for training.")
    parser.add_argument("--eval_batch_size",
                        default=8,
                        type=int,
                        help="Total batch size for eval.")
    parser.add_argument("--learning_rate",
                        default=5e-5,
                        type=float,
                        help="The initial learning rate for Adam.")
    parser.add_argument("--num_train_epochs",
                        default=3.0,
                        type=float,
                        help="Total number of training epochs to perform.")
    parser.add_argument(
        "--warmup_proportion",
        default=0.1,
        type=float,
        help=
        "Proportion of training to perform linear learning rate warmup for. "
        "E.g., 0.1 = 10%% of training.")
    parser.add_argument("--no_cuda",
                        action='store_true',
                        help="Whether not to use CUDA when available")
    parser.add_argument("--local_rank",
                        type=int,
                        default=-1,
                        help="local_rank for distributed training on gpus")
    parser.add_argument('--seed',
                        type=int,
                        default=42,
                        help="random seed for initialization")
    parser.add_argument(
        '--gradient_accumulation_steps',
        type=int,
        default=1,
        help=
        "Number of updates steps to accumulate before performing a backward/update pass."
    )
    parser.add_argument(
        '--fp16',
        action='store_true',
        help="Whether to use 16-bit float precision instead of 32-bit")
    parser.add_argument(
        '--loss_scale',
        type=float,
        default=0,
        help=
        "Loss scaling to improve fp16 numeric stability. Only used when fp16 set to True.\n"
        "0 (default value): dynamic loss scaling.\n"
        "Positive power of 2: static loss scaling value.\n")
    parser.add_argument('--server_ip',
                        type=str,
                        default='',
                        help="Can be used for distant debugging.")
    parser.add_argument('--server_port',
                        type=str,
                        default='',
                        help="Can be used for distant debugging.")
    args = parser.parse_args()

    if args.server_ip and args.server_port:
        # Distant debugging - see https://code.visualstudio.com/docs/python/debugging#_attach-to-a-local-script
        import ptvsd
        print("Waiting for debugger attach")
        ptvsd.enable_attach(address=(args.server_ip, args.server_port),
                            redirect_output=True)
        ptvsd.wait_for_attach()

    if args.local_rank == -1 or args.no_cuda:
        device = torch.device("cuda" if torch.cuda.is_available()
                              and not args.no_cuda else "cpu")
        n_gpu = torch.cuda.device_count()
    else:
        torch.cuda.set_device(args.local_rank)
        device = torch.device("cuda", args.local_rank)
        n_gpu = 1
        # Initializes the distributed backend which will take care of sychronizing nodes/GPUs
        torch.distributed.init_process_group(backend='nccl')

    logger.info(
        "device: {} n_gpu: {}, distributed training: {}, 16-bits training: {}".
        format(device, n_gpu, bool(args.local_rank != -1), args.fp16))

    if args.gradient_accumulation_steps < 1:
        raise ValueError(
            "Invalid gradient_accumulation_steps parameter: {}, should be >= 1"
            .format(args.gradient_accumulation_steps))

    args.train_batch_size = args.train_batch_size // args.gradient_accumulation_steps

    random.seed(args.seed)
    np.random.seed(args.seed)
    torch.manual_seed(args.seed)

    if n_gpu > 0:
        torch.cuda.manual_seed_all(args.seed)

    if not args.do_train and not args.do_eval:
        raise ValueError(
            "At least one of `do_train` or `do_eval` must be True.")

    if os.path.exists(args.output_dir) and os.listdir(
            args.output_dir) and args.do_train:
        raise ValueError(
            "Output directory ({}) already exists and is not empty.".format(
                args.output_dir))
    if not os.path.exists(args.output_dir):
        os.makedirs(args.output_dir)

    tokenizer = BertTokenizer.from_pretrained(args.bert_model,
                                              do_lower_case=args.do_lower_case)

    data_handler = DataHandler()
    train_data, dev_data = data_handler.get_data_set_by_id(args.data_set)

    if args.additional_data_set is not None:
        logger.info(
            f"Extending training data with instances from {args.additional_data_set}"
        )
        add_train_data, add_dev_data = data_handler.get_data_set_by_id(
            args.additional_data_set)

        train_data = train_data.append(add_train_data)
        train_data = train_data.append(add_dev_data)

    logger.info(
        f"Data set contains {len(train_data)} training and {len(dev_data)} development instances"
    )

    test_data = None
    if args.do_test:
        test_data = data_handler.get_test_data()

    processor = DataProcessor(train_data, dev_data, test_data)
    label_list = processor.get_labels()
    logger.info(f"Labels: {str(label_list)}")

    label_encoder = LabelEncoder()
    label_encoder.fit(label_list)

    num_labels = len(label_encoder.classes_)
    logger.info(f"Num labels: {num_labels}")

    train_examples = None
    num_train_optimization_steps = None
    if args.do_train:
        train_examples = processor.get_train_instances()

        num_train_optimization_steps = int(
            len(train_examples) / args.train_batch_size /
            args.gradient_accumulation_steps) * args.num_train_epochs

        if args.local_rank != -1:
            num_train_optimization_steps = num_train_optimization_steps // torch.distributed.get_world_size(
            )

    # Prepare model
    cache_dir = args.cache_dir if args.cache_dir else os.path.join(
        PYTORCH_PRETRAINED_BERT_CACHE, 'distributed_{}'.format(
            args.local_rank))
    model = BertForMultiLabelSequenceClassification.from_pretrained(
        args.bert_model, cache_dir=cache_dir, num_labels=num_labels)

    if args.fp16:
        model.half()
    model.to(device)

    if args.local_rank != -1:
        try:
            from apex.parallel import DistributedDataParallel as DDP
        except ImportError:
            raise ImportError \
                ("Please install apex from https://www.github.com/nvidia/apex to use distributed and fp16 training.")

        model = DDP(model)
    elif n_gpu > 1:
        model = torch.nn.DataParallel(model)

    # Prepare optimizer
    param_optimizer = list(model.named_parameters())
    no_decay = ['bias', 'LayerNorm.bias', 'LayerNorm.weight']
    optimizer_grouped_parameters = [{
        'params':
        [p for n, p in param_optimizer if not any(nd in n for nd in no_decay)],
        'weight_decay':
        0.01
    }, {
        'params':
        [p for n, p in param_optimizer if any(nd in n for nd in no_decay)],
        'weight_decay':
        0.0
    }]
    if args.fp16:
        try:
            from apex.optimizers import FP16_Optimizer
            from apex.optimizers import FusedAdam
        except ImportError:
            raise ImportError \
                ("Please install apex from https://www.github.com/nvidia/apex to use distributed and fp16 training.")

        optimizer = FusedAdam(optimizer_grouped_parameters,
                              lr=args.learning_rate,
                              bias_correction=False,
                              max_grad_norm=1.0)

        if args.loss_scale == 0:
            optimizer = FP16_Optimizer(optimizer, dynamic_loss_scale=True)
        else:
            optimizer = FP16_Optimizer(optimizer,
                                       static_loss_scale=args.loss_scale)

    else:
        optimizer = BertAdam(optimizer_grouped_parameters,
                             lr=args.learning_rate,
                             warmup=args.warmup_proportion,
                             t_total=num_train_optimization_steps)

    global_step = 0
    nb_tr_steps = 0
    global_batch_no = 0
    tr_loss = 0
    if args.do_train:
        train_features = convert_examples_to_features(train_examples,
                                                      label_encoder,
                                                      args.max_seq_length,
                                                      tokenizer)

        logger.info("***** Running training *****")
        logger.info("  Num examples = %d", len(train_examples))
        logger.info("  Batch size = %d", args.train_batch_size)
        logger.info("  Num steps = %d", num_train_optimization_steps)

        all_input_ids = torch.tensor([f.input_ids for f in train_features],
                                     dtype=torch.long)
        all_input_mask = torch.tensor([f.input_mask for f in train_features],
                                      dtype=torch.long)
        all_segment_ids = torch.tensor([f.segment_ids for f in train_features],
                                       dtype=torch.long)
        all_label_ids = torch.tensor([f.label_ids for f in train_features],
                                     dtype=torch.float)

        train_data = TensorDataset(all_input_ids, all_input_mask,
                                   all_segment_ids, all_label_ids)
        if args.local_rank == -1:
            train_sampler = RandomSampler(train_data)
        else:
            train_sampler = DistributedSampler(train_data)

        train_dataloader = DataLoader(train_data,
                                      sampler=train_sampler,
                                      batch_size=args.train_batch_size)

        max_f1 = 0.0
        for epoch in trange(int(args.num_train_epochs), desc="Epoch"):
            model.train()

            tr_loss = 0
            nb_tr_examples, nb_tr_steps = 0, 0
            for step, batch in enumerate(
                    tqdm(train_dataloader, desc="Iteration")):
                batch = tuple(t.to(device) for t in batch)
                input_ids, input_mask, segment_ids, label_ids = batch
                loss = model(input_ids, segment_ids, input_mask, label_ids)
                if n_gpu > 1:
                    loss = loss.mean()  # mean() to average on multi-gpu.
                if args.gradient_accumulation_steps > 1:
                    loss = loss / args.gradient_accumulation_steps

                if args.fp16:
                    optimizer.backward(loss)
                else:
                    loss.backward()

                loss_value = loss.item()
                tr_loss += loss_value

                nb_tr_examples += input_ids.size(0)
                nb_tr_steps += 1

                global_batch_no += 1

                if (step + 1) % args.gradient_accumulation_steps == 0:
                    if args.fp16:
                        # modify learning rate with special warm up BERT uses
                        # if args.fp16 is False, BertAdam is used that handles this automatically
                        lr_this_step = args.learning_rate * warmup_linear(
                            global_step / num_train_optimization_steps,
                            args.warmup_proportion)
                        for param_group in optimizer.param_groups:
                            param_group['lr'] = lr_this_step
                    optimizer.step()
                    optimizer.zero_grad()
                    global_step += 1

            if (epoch + 1) % 2 == 0:
                eval_examples = processor.get_dev_instances()
                eval_features = convert_examples_to_features(
                    eval_examples, label_encoder, args.max_seq_length,
                    tokenizer)

                logger.info("***** Running evaluation *****")
                logger.info("  Num examples = %d", len(eval_examples))
                logger.info("  Batch size = %d", args.eval_batch_size)

                all_input_ids = torch.tensor(
                    [f.input_ids for f in eval_features], dtype=torch.long)
                all_input_mask = torch.tensor(
                    [f.input_mask for f in eval_features], dtype=torch.long)
                all_segment_ids = torch.tensor(
                    [f.segment_ids for f in eval_features], dtype=torch.long)
                all_label_ids = torch.tensor(
                    [f.label_ids for f in eval_features], dtype=torch.float)
                eval_data = TensorDataset(all_input_ids, all_input_mask,
                                          all_segment_ids, all_label_ids)

                # Run prediction for full data
                eval_sampler = SequentialSampler(eval_data)
                eval_dataloader = DataLoader(eval_data,
                                             sampler=eval_sampler,
                                             batch_size=args.eval_batch_size)

                model.eval()
                eval_loss, eval_accuracy = 0, 0
                nb_eval_steps, nb_eval_examples = 0, 0

                y_dev = None
                y_dev_pred = None

                y_dev_sigmoid = None

                for input_ids, input_mask, segment_ids, label_ids in tqdm(
                        eval_dataloader, desc="Evaluating"):
                    input_ids = input_ids.to(device)
                    input_mask = input_mask.to(device)
                    segment_ids = segment_ids.to(device)
                    label_ids = label_ids.to(device)

                    with torch.no_grad():
                        tmp_eval_loss = model(input_ids, segment_ids,
                                              input_mask, label_ids)
                        logits = model(input_ids, segment_ids, input_mask)

                    # logits = logits.detach().cpu().numpy()
                    # prediction = np.argmax(logits, axis=1)

                    logits_cpu = logits.detach().cpu()
                    logits_sigmoid = logits_cpu.sigmoid()
                    if y_dev_pred is None:
                        y_dev_sigmoid = logits_sigmoid
                    else:
                        y_dev_sigmoid = np.concatenate(
                            (y_dev_sigmoid, logits_sigmoid), axis=0)

                    pred_logits = logits.detach().cpu().numpy()
                    if y_dev_pred is None:
                        y_dev_pred = pred_logits
                    else:
                        y_dev_pred = np.concatenate((y_dev_pred, pred_logits),
                                                    axis=0)

                    if y_dev is None:
                        y_dev = label_ids.detach().cpu().numpy()
                    else:
                        y_dev = np.concatenate(
                            (y_dev, label_ids.detach().cpu().numpy()), axis=0)

                    tmp_eval_accuracy = accuracy_thresh(logits, label_ids)

                    eval_loss += tmp_eval_loss.mean().item()
                    eval_accuracy += tmp_eval_accuracy

                    nb_eval_examples += input_ids.size(0)
                    nb_eval_steps += 1

                eval_loss = eval_loss / nb_eval_steps
                eval_accuracy = eval_accuracy / nb_eval_examples
                loss = tr_loss / nb_tr_steps if args.do_train else None

                i = 0
                gold_labels = dict()
                pred_labels = dict()

                prediction_output = dict()
                for example, true_logits, pred_logits in zip(
                        eval_examples, y_dev, y_dev_sigmoid):
                    true_indexes = np.argwhere(true_logits > 0.0)
                    labels = [
                        label_encoder.inverse_transform(y)[0]
                        for y in true_indexes
                    ]

                    pred_indexes = np.argwhere(pred_logits > 0.5)
                    pred = [
                        label_encoder.inverse_transform(y)[0]
                        for y in pred_indexes
                    ]

                    gold_labels[str(example.guid)] = labels
                    pred_labels[str(example.guid)] = pred

                    class_logits = {
                        label_encoder.inverse_transform([j])[0]:
                        float(pred_logits[j])
                        for j in range(len(label_encoder.classes_))
                    }
                    prediction_output[example.guid] = class_logits

                    i += 1

                pred_output_file = os.path.join(
                    args.output_dir, f"prediction_output_{epoch+1}.json")
                json.dump(prediction_output,
                          open(pred_output_file, 'w'),
                          sort_keys=True,
                          indent=2)

                result = {
                    'eval_loss': eval_loss,
                    'eval_accuracy': eval_accuracy,
                    'global_step': global_step,
                    'loss': loss,
                }

                eval_util = EvaluationUtil()

                pred_file = os.path.join(args.output_dir,
                                         f"dev_pred_{epoch+1}.txt")
                eval_util.save_predictions(pred_labels, pred_file)

                clef19_result = eval_util.evaluate(pred_labels, gold_labels)

                f1_score = clef19_result["eval_fscore"]
                if f1_score > max_f1:
                    # Save a trained model and the associated configuration
                    model_to_save = model.module if hasattr(
                        model,
                        'module') else model  # Only save the model it-self
                    output_model_file = os.path.join(args.output_dir,
                                                     WEIGHTS_NAME)
                    torch.save(model_to_save.state_dict(), output_model_file)
                    output_config_file = os.path.join(args.output_dir,
                                                      CONFIG_NAME)
                    with open(output_config_file, 'w') as f:
                        f.write(model_to_save.config.to_json_string())

                    max_f1 = f1_score

                icd10_ontology = data_handler.read_icd10_ontology()
                pred_labels_extended = eval_util.extend_paths(
                    pred_labels, icd10_ontology)

                pred_extended_file = os.path.join(
                    args.output_dir, f"dev_pred_extended_{epoch+1}.txt")
                eval_util.save_predictions(pred_labels_extended,
                                           pred_extended_file)

                extended_clef19_result = eval_util.evaluate(
                    pred_labels_extended, gold_labels)

                output_eval_file = os.path.join(args.output_dir,
                                                f"eval_results_{epoch+1}.txt")
                with open(output_eval_file, "w") as writer:
                    logger.info("***** Eval results *****")
                    for key in sorted(result.keys()):
                        logger.info("  %s = %s", key, str(result[key]))
                        writer.write("%s = %s\n" % (key, str(result[key])))

                    clef10_result_str = eval_util.format_result(clef19_result)
                    logger.info(f"CLEF19 evaluation: {clef10_result_str}")
                    writer.write("\nResults prediction:\n")
                    writer.write(clef10_result_str)

                    extended_clef10_result_str = eval_util.format_result(
                        extended_clef19_result)
                    logger.info(
                        f"CLEF19 evaluation (extended): {extended_clef10_result_str}"
                    )
                    writer.write("\n\nResults extended prediction:\n")
                    writer.write(extended_clef10_result_str)

    #if not args.do_train:
    # (Re-) Load best model
    output_model_file = os.path.join(args.output_dir, WEIGHTS_NAME)
    output_config_file = os.path.join(args.output_dir, CONFIG_NAME)

    config = BertConfig(output_config_file)
    model = BertForMultiLabelSequenceClassification(config,
                                                    num_labels=num_labels)
    model.load_state_dict(torch.load(output_model_file))

    model.to(device)

    if args.do_eval and (args.local_rank == -1
                         or torch.distributed.get_rank() == 0):
        eval_examples = processor.get_dev_instances()
        eval_features = convert_examples_to_features(eval_examples,
                                                     label_encoder,
                                                     args.max_seq_length,
                                                     tokenizer)

        logger.info("***** Running evaluation *****")
        logger.info("  Num examples = %d", len(eval_examples))
        logger.info("  Batch size = %d", args.eval_batch_size)

        all_input_ids = torch.tensor([f.input_ids for f in eval_features],
                                     dtype=torch.long)
        all_input_mask = torch.tensor([f.input_mask for f in eval_features],
                                      dtype=torch.long)
        all_segment_ids = torch.tensor([f.segment_ids for f in eval_features],
                                       dtype=torch.long)
        all_label_ids = torch.tensor([f.label_ids for f in eval_features],
                                     dtype=torch.float)
        eval_data = TensorDataset(all_input_ids, all_input_mask,
                                  all_segment_ids, all_label_ids)

        # Run prediction for full data
        eval_sampler = SequentialSampler(eval_data)
        eval_dataloader = DataLoader(eval_data,
                                     sampler=eval_sampler,
                                     batch_size=args.eval_batch_size)

        model.eval()
        eval_loss, eval_accuracy = 0, 0
        nb_eval_steps, nb_eval_examples = 0, 0

        y_dev = None
        y_dev_pred = None

        y_dev_sigmoid = None

        for input_ids, input_mask, segment_ids, label_ids in tqdm(
                eval_dataloader, desc="Evaluating"):
            input_ids = input_ids.to(device)
            input_mask = input_mask.to(device)
            segment_ids = segment_ids.to(device)
            label_ids = label_ids.to(device)

            with torch.no_grad():
                tmp_eval_loss = model(input_ids, segment_ids, input_mask,
                                      label_ids)
                logits = model(input_ids, segment_ids, input_mask)

            #logits = logits.detach().cpu().numpy()
            #prediction = np.argmax(logits, axis=1)

            logits_cpu = logits.detach().cpu()
            logits_sigmoid = logits_cpu.sigmoid()

            if y_dev_sigmoid is None:
                y_dev_sigmoid = logits_sigmoid
            else:
                y_dev_sigmoid = np.concatenate((y_dev_sigmoid, logits_sigmoid),
                                               axis=0)

            pred_logits = logits.detach().cpu().numpy()
            if y_dev_pred is None:
                y_dev_pred = pred_logits
            else:
                y_dev_pred = np.concatenate((y_dev_pred, pred_logits), axis=0)

            if y_dev is None:
                y_dev = label_ids.detach().cpu().numpy()
            else:
                y_dev = np.concatenate(
                    (y_dev, label_ids.detach().cpu().numpy()), axis=0)

            tmp_eval_accuracy = accuracy_thresh(logits, label_ids)

            eval_loss += tmp_eval_loss.mean().item()
            eval_accuracy += tmp_eval_accuracy

            nb_eval_examples += input_ids.size(0)
            nb_eval_steps += 1

        eval_loss = eval_loss / nb_eval_steps
        eval_accuracy = eval_accuracy / nb_eval_examples
        loss = tr_loss / nb_tr_steps if args.do_train else None

        i = 0
        gold_labels = dict()
        pred_labels = dict()

        prediction_output = dict()

        for example, true_logits, pred_logits in zip(eval_examples, y_dev,
                                                     y_dev_sigmoid):
            true_indexes = np.argwhere(true_logits > 0.0)
            labels = [
                label_encoder.inverse_transform(y)[0] for y in true_indexes
            ]

            pred_indexes = np.argwhere(pred_logits > 0.5)
            pred = [
                label_encoder.inverse_transform(y)[0] for y in pred_indexes
            ]

            if i < 2:
                logger.info(f"Example: {example.guid}")
                logger.info(f"Example labels: {example.labels}")
                logger.info(f"True labels: {labels}")
                logger.info(f"Pred labels: {pred}")

            gold_labels[str(example.guid)] = labels
            pred_labels[str(example.guid)] = pred

            class_logits = {
                label_encoder.inverse_transform([j])[0]: float(pred_logits[j])
                for j in range(len(label_encoder.classes_))
            }
            prediction_output[example.guid] = class_logits

            i += 1

        pred_output_file = os.path.join(args.output_dir,
                                        "prediction_output.json")
        json.dump(prediction_output,
                  open(pred_output_file, 'w'),
                  sort_keys=True,
                  indent=2)

        result = {
            'eval_loss': eval_loss,
            'eval_accuracy': eval_accuracy,
            'global_step': global_step,
            'loss': loss,
        }

        eval_util = EvaluationUtil()

        pred_file = os.path.join(args.output_dir, "dev_pred.txt")
        eval_util.save_predictions(pred_labels, pred_file)

        clef19_result = eval_util.evaluate(pred_labels, gold_labels)

        icd10_ontology = data_handler.read_icd10_ontology()
        pred_labels_extended = eval_util.extend_paths(pred_labels,
                                                      icd10_ontology)

        pred_extended_file = os.path.join(args.output_dir,
                                          "dev_pred_extended.txt")
        eval_util.save_predictions(pred_labels_extended, pred_extended_file)

        extended_clef19_result = eval_util.evaluate(pred_labels_extended,
                                                    gold_labels)

        output_eval_file = os.path.join(args.output_dir, "eval_results.txt")
        with open(output_eval_file, "w") as writer:
            logger.info("***** Eval results *****")
            for key in sorted(result.keys()):
                logger.info("  %s = %s", key, str(result[key]))
                writer.write("%s = %s\n" % (key, str(result[key])))

            clef10_result_str = eval_util.format_result(clef19_result)
            logger.info(f"CLEF19 evaluation: {clef10_result_str}")
            writer.write("\nResults prediction:\n")
            writer.write(clef10_result_str)

            extended_clef10_result_str = eval_util.format_result(
                extended_clef19_result)
            logger.info(
                f"CLEF19 evaluation (extended): {extended_clef10_result_str}")
            writer.write("\n\nResults extended prediction:\n")
            writer.write(extended_clef10_result_str)

    if args.do_test:
        test_examples = processor.get_test_instances()
        test_features = convert_examples_to_features(test_examples,
                                                     label_encoder,
                                                     args.max_seq_length,
                                                     tokenizer)

        logger.info("***** Running test *****")
        logger.info("  Num examples = %d", len(test_examples))
        logger.info("  Batch size = %d", args.eval_batch_size)

        all_input_ids = torch.tensor([f.input_ids for f in test_features],
                                     dtype=torch.long)
        all_input_mask = torch.tensor([f.input_mask for f in test_features],
                                      dtype=torch.long)
        all_segment_ids = torch.tensor([f.segment_ids for f in test_features],
                                       dtype=torch.long)

        test_data = TensorDataset(all_input_ids, all_input_mask,
                                  all_segment_ids)

        # Run prediction for full data
        test_sampler = SequentialSampler(test_data)
        test_dataloader = DataLoader(test_data,
                                     sampler=test_sampler,
                                     batch_size=args.eval_batch_size)

        model.eval()
        y_dev_sigmoid = None

        for input_ids, input_mask, segment_ids in tqdm(test_dataloader,
                                                       desc="Testing"):
            input_ids = input_ids.to(device)
            input_mask = input_mask.to(device)
            segment_ids = segment_ids.to(device)

            with torch.no_grad():
                logits = model(input_ids, segment_ids, input_mask)

            logits_sigmoid = logits.detach().cpu().sigmoid()
            if y_dev_sigmoid is None:
                y_dev_sigmoid = logits_sigmoid
            else:
                y_dev_sigmoid = np.concatenate((y_dev_sigmoid, logits_sigmoid),
                                               axis=0)

        i = 0
        test_labels = dict()
        test_output = dict()

        for example, pred_logits in zip(test_examples, y_dev_sigmoid):
            pred_indexes = np.argwhere(pred_logits > 0.5)
            pred = [
                label_encoder.inverse_transform(y)[0] for y in pred_indexes
            ]

            if i < 2:
                logger.info(f"Example: {example.guid}")
                logger.info(f"Pred labels: {pred}")

            test_labels[str(example.guid)] = pred

            class_logits = {
                label_encoder.inverse_transform([j])[0]: float(pred_logits[j])
                for j in range(len(label_encoder.classes_))
            }
            test_output[example.guid] = class_logits

            i += 1

        pred_output_file = os.path.join(args.output_dir, "test_output.json")
        json.dump(test_output,
                  open(pred_output_file, 'w'),
                  sort_keys=True,
                  indent=2)

        eval_util = EvaluationUtil()

        test_file = os.path.join(args.output_dir, "test_pred.txt")
        eval_util.save_predictions(test_labels, test_file)

        icd10_ontology = data_handler.read_icd10_ontology()
        test_labels_extended = eval_util.extend_paths(test_labels,
                                                      icd10_ontology)

        test_extended_file = os.path.join(args.output_dir,
                                          "test_pred_extended.txt")
        eval_util.save_predictions(test_labels_extended, test_extended_file)
示例#19
0
class CaffeProcThread(CodependentThread):
    '''Runs Caffe in separate thread.'''

    def __init__(self, net, state, loop_sleep, pause_after_keys, heartbeat_required):
        CodependentThread.__init__(self, heartbeat_required)
        self.daemon = True
        self.net = net
        self.input_dims = self.net.blobs['data'].data.shape[2:4]    # e.g. (227,227)
        self.state = state
        self.frames_processed_fwd = 0
        self.frames_processed_back = 0
        self.loop_sleep = loop_sleep
        self.pause_after_keys = pause_after_keys
        self.debug_level = 0
        self.descriptor = None
        self.descriptor_layer_1 = 'conv5'
        self.descriptor_layer_2 = 'conv4'
        self.descriptor_layers = ['conv5','conv4']
        self.net_input_image = None
        self.descriptor_handler = DescriptorHandler(self.state.settings.ros_dir + '/models/memory/', self.descriptor_layers)
        self.data_handler = DataHandler(self.state.settings.ros_dir)
        self.available_layer = ['conv1', 'pool1', 'norm1', 'conv2', 'pool2', 'norm2', 'conv3', 'conv4', 'conv5', 'pool5', 'fc6', 'fc7', 'fc8', 'prob']
        #['conv1', 'conv2', 'conv3', 'conv4', 'conv5', 'fc6', 'fc7', 'fc8', 'prob']
        # print "layers ", list(self.net._layer_names)

        s = rospy.Service('get_cnn_state', GetState, self.handle_get_cnn_state)

    def handle_get_cnn_state(self, req):
        resp = GetStateResponse()
        print "get req", req
        state = perception_msgs.msg.State()
        state.type = req.type
        state.name = req.name
        if req.name == "None":
            state.name = self.data_handler.save_net(self.net)
        else:
            print "not implemented yet"
        resp.state = state
        resp.pose = Pose()
        print "state", resp

        return resp

    def mask_out(self, data, mask):
        # print "data shape", data.shape
        dim = data.shape

        for y in range(dim[2]):
            for x in range(dim[3]):
                if is_masked((dim[2],dim[3]),(x,y),mask):
                    data[:,:,y,x] = 0

        return data

    def net_preproc_forward(self, img):
        assert img.shape == (227,227,3), 'img is wrong size'
        #resized = caffe.io.resize_image(img, net.image_dims)   # e.g. (227, 227, 3)
        data_blob = self.net.transformer.preprocess('data', img)                # e.g. (3, 227, 227), mean subtracted and scaled to [0,255]
        data_blob = data_blob[np.newaxis,:,:,:]                   # e.g. (1, 3, 227, 227)
        output = self.net.forward(data=data_blob)
        return output

    def net_proc_forward_layer(self, img, mask):
        assert img.shape == (227,227,3), 'img is wrong size'
        #resized = caffe.io.resize_image(img, net.image_dims)   # e.g. (227, 227, 3)
        data_blob = self.net.transformer.preprocess('data', img)                # e.g. (3, 227, 227), mean subtracted and scaled to [0,255]
        data_blob = data_blob[np.newaxis,:,:,:]                   # e.g. (1, 3, 227, 227)
        # print "mask", mask.shape
        self.net.blobs['data'].data[...] = data_blob
        proc_layers = ['conv1', 'conv2', 'conv3', 'conv4', 'conv5', 'prob']


        mask_layers = ['']
        mode = 0
        if mode == 0:
            self.net.forward_from_to(start='conv1',end='relu1')
            self.mask_out(self.net.blobs['conv1'].data, mask)
            self.net.forward_from_to(start='relu1',end='prob')

        elif mode == 1:
            self.net.forward_from_to(start='conv1',end='relu1')
            self.mask_out(self.net.blobs['conv1'].data, mask)
            self.net.forward_from_to(start='relu1',end='conv2')

            self.net.forward_from_to(start='conv2',end='relu2')
            self.mask_out(self.net.blobs['conv2'].data, mask)
            self.net.forward_from_to(start='relu2',end='conv3')

            self.net.forward_from_to(start='conv3',end='relu3')
            self.mask_out(self.net.blobs['conv3'].data, mask)
            self.net.forward_from_to(start='relu3',end='conv4')

            self.net.forward_from_to(start='conv4',end='relu4')
            self.mask_out(self.net.blobs['conv4'].data, mask)
            self.net.forward_from_to(start='relu4',end='conv5')

            self.net.forward_from_to(start='conv5',end='relu5')
            self.mask_out(self.net.blobs['conv5'].data, mask)
            self.net.forward_from_to(start='relu5',end='prob')

        elif mode == 2:
            for idx in range(0,len(proc_layers)-1):
                output = self.net.forward_from_to(start=proc_layers[idx],end=proc_layers[idx+1])
                self.mask_out(self.net.blobs[proc_layers[idx]].data, mask)

        # for idx in range(len(self.available_layer)-1):
        #     output = self.net.forward(data=data_blob,start=self.available_layer[idx],end=self.available_layer[idx+1])
        #     if self.available_layer[idx].startswith("conv"):
        #         new_blob = self.net.blobs[self.available_layer[idx]].data
        #         new_blob.data = self.mask_out(self.net.blobs[self.available_layer[idx]].data, mask)
        #         self.net.blobs[self.available_layer[idx]] = new_blob
            # print output

        # return output

    def save_descriptor(self):
        print 'save descriptor'
        # print type(self.net.blobs[self.descriptor_layer_1])
        # descriptor_1 = np.array(caffe.io.blobproto_to_array(self.net.blobs[self.descriptor_layer_1]))
        # descriptor_2 = np.array(caffe.io.blobproto_to_array(self.net.blobs[self.descriptor_layer_2]))
        # print descriptor
        self.time_name = strftime("%d-%m-%Y-%H:%M:%S", gmtime())

        desc = self.descriptor_handler.gen_descriptor(self.time_name, self.net.blobs)
        self.descriptor_handler.save(self.state.settings.ros_dir + '/models/memory/', desc)

        # np.save(self.state.settings.ros_dir + '/models/memory/' + self.time_name + "_" + self.descriptor_layer_1 + '.npy', descriptor_1)
        # np.save(self.state.settings.ros_dir + '/models/memory/' + self.time_name + "_" + self.descriptor_layer_2 + '.npy', descriptor_2)
        cv2.imwrite(self.state.settings.ros_dir + '/models/memory/' + self.time_name + '.jpg', self.net_input_image[:,:,::-1])

        self.state.save_descriptor = False

    def run(self):
        print 'CaffeProcThread.run called'
        frame = None
        mask = None
        while not self.is_timed_out():
            with self.state.lock:
                if self.state.quit:
                    #print 'CaffeProcThread.run: quit is True'
                    #print self.state.quit
                    break

                #print 'CaffeProcThread.run: caffe_net_state is:', self.state.caffe_net_state

                #print 'CaffeProcThread.run loop: next_frame: %s, caffe_net_state: %s, back_enabled: %s' % (
                #    'None' if self.state.next_frame is None else 'Avail',
                #    self.state.caffe_net_state,
                #    self.state.back_enabled)

                frame = None
                mask = None
                run_fwd = False
                run_back = False
                if self.state.caffe_net_state == 'free' and time.time() - self.state.last_key_at > self.pause_after_keys:
                    frame = self.state.next_frame
                    mask = self.state.mask
                    self.state.next_frame = None
                    back_enabled = self.state.back_enabled
                    back_mode = self.state.back_mode
                    back_stale = self.state.back_stale
                    #state_layer = self.state.layer
                    #selected_unit = self.state.selected_unit
                    backprop_layer = self.state.backprop_layer
                    backprop_unit = self.state.backprop_unit

                    # Forward should be run for every new frame
                    run_fwd = (frame is not None)
                    # Backward should be run if back_enabled and (there was a new frame OR back is stale (new backprop layer/unit selected))
                    run_back = (back_enabled and (run_fwd or back_stale))
                    self.state.caffe_net_state = 'proc' if (run_fwd or run_back) else 'free'

            #print 'run_fwd,run_back =', run_fwd, run_back

            if run_fwd:
                #print 'TIMING:, processing frame'
                self.frames_processed_fwd += 1
                self.net_input_image = cv2.resize(frame, self.input_dims)
                with WithTimer('CaffeProcThread:forward', quiet = self.debug_level < 1):
                    print "run forward layer"
                    self.net_proc_forward_layer(self.net_input_image, mask)
                    # self.net_preproc_forward(self.net_input_image)

            if self.state.save_descriptor:
                self.save_descriptor()

            # switch descriptor for match and back prop
            if self.state.next_descriptor:
                    print 'load descriptor'
                    self.descriptor = self.descriptor_handler.get_next()
                    self.state.next_descriptor = False


            if self.state.compare_descriptor:
                # find
                print 'compare'
                desc_current = self.descriptor_handler.gen_descriptor('current', self.net.blobs)
                match_file = self.descriptor_handler.get_max_match(desc_current)
                print 'match: ' + match_file
                self.state.compare_descriptor = False

            if run_back:
                print "run backward"
                # Match to saved descriptor
                if self.state.match_descriptor:
                    print '*'
                    diffs = self.net.blobs[self.descriptor_layer_1].diff * 0

                    # zero all diffs if doesn't match
                    print "shape ", self.net.blobs[self.descriptor_layer_1].data.shape
                    for unit, response in enumerate(self.net.blobs[self.descriptor_layer_1].data[0]):
                        if response.max() > 0 and abs(response.max() - self.descriptor.get_sig_list()[0][0][unit].max())/response.max() < 0.2:
                            diffs[0][unit] = self.net.blobs[self.descriptor_layer_1].data[0][unit]

                    assert back_mode in ('grad', 'deconv')
                    if back_mode == 'grad':
                        with WithTimer('CaffeProcThread:backward', quiet = self.debug_level < 1):
                            #print '**** Doing backprop with %s diffs in [%s,%s]' % (backprop_layer, diffs.min(), diffs.max())
                            self.net.backward_from_layer(self.descriptor_layer_1, diffs, zero_higher = True)
                    else:
                        with WithTimer('CaffeProcThread:deconv', quiet = self.debug_level < 1):
                            #print '**** Doing deconv with %s diffs in [%s,%s]' % (backprop_layer, diffs.min(), diffs.max())
                            self.net.deconv_from_layer(self.descriptor_layer_1, diffs, zero_higher = True)

                    with self.state.lock:
                        self.state.back_stale = False

                # Filter when back propagating
                elif self.state.backprop_filter:
                    print "run_back"
                    # print backprop_layer
                    start_layer_idx = self.available_layer.index(backprop_layer)
                    idx = start_layer_idx
                    for current_layer in list(reversed(self.available_layer[0:start_layer_idx+1])):

                        diffs = self.net.blobs[current_layer].diff * 0
                        max_response = self.net.blobs[current_layer].data[0].max()
                        for unit, response in enumerate(self.net.blobs[current_layer].data[0]):
                            if response.max() > max_response * 0.6:
                                diffs[0][unit] = self.net.blobs[current_layer].data[0,unit]


                        assert back_mode in ('grad', 'deconv')
                        if back_mode == 'grad':
                            with WithTimer('CaffeProcThread:backward', quiet = self.debug_level < 1):
                                #print '**** Doing backprop with %s diffs in [%s,%s]' % (backprop_layer, diffs.min(), diffs.max())
                                self.net.backward_from_to_layer(current_layer, diffs, self.available_layer[idx-1], zero_higher = (idx == start_layer_idx))
                        # else:
                        #     with WithTimer('CaffeProcThread:deconv', quiet = self.debug_level < 1):
                        #         #print '**** Doing deconv with %s diffs in [%s,%s]' % (backprop_layer, diffs.min(), diffs.max())
                        #         self.net.deconv_from_layer(backprop_layer, diffs, zero_higher = True)
                        idx -= 1
                    with self.state.lock:
                        self.state.back_stale = False

                # original approach
                else:
                    diffs = self.net.blobs[backprop_layer].diff * 0
                    diffs[0][backprop_unit] = self.net.blobs[backprop_layer].data[0,backprop_unit]

                    assert back_mode in ('grad', 'deconv')
                    if back_mode == 'grad':
                        with WithTimer('CaffeProcThread:backward', quiet = self.debug_level < 1):
                            #print '**** Doing backprop with %s diffs in [%s,%s]' % (backprop_layer, diffs.min(), diffs.max())
                            self.net.backward_from_layer(backprop_layer, diffs, zero_higher = True)
                    else:
                        with WithTimer('CaffeProcThread:deconv', quiet = self.debug_level < 1):
                            #print '**** Doing deconv with %s diffs in [%s,%s]' % (backprop_layer, diffs.min(), diffs.max())
                            self.net.deconv_from_layer(backprop_layer, diffs, zero_higher = True)

                    with self.state.lock:
                        self.state.back_stale = False

            if run_fwd or run_back:
                with self.state.lock:
                    self.state.caffe_net_state = 'free'
                    self.state.drawing_stale = True
            else:
                time.sleep(self.loop_sleep)
            time.sleep(0.1)
        print 'CaffeProcThread.run: finished'
        print 'CaffeProcThread.run: processed %d frames fwd, %d frames back' % (self.frames_processed_fwd, self.frames_processed_back)
示例#20
0
    #                 crossref=TEXT(stored=True), isbn=TEXT, series=TEXT, school=TEXT,
    #                 chapter=TEXT(stored=True, analyzer=StemmingAnalyzer()),
    #                 publnr=TEXT(stored=True))

    # mi serve nel caso in cui non ho fields specificati nella query, vado a cercare in ogni field
    schemaFields = ["type","author","title","year", "journal","ee","publisher"]
    #se l'indice è già costruito non lo devo rifare
    if not os.path.exists("indexdir"):
        os.mkdir("indexdir")
        ix = create_in("indexdir", schema)
        # get the number of processors
        nproc = multiprocessing.cpu_count()
        writer = ix.writer(procs=nproc, limitmb=512)

        parser = xml.sax.make_parser()
        handler = DH.DataHandler(writer)
        parser.setContentHandler(handler)
        parser.parse('../dblp.xml')

        writer.commit(optimize=True)
    else:
        ix = whoosh.index.open_dir("indexdir", schema=schema)

    # il searcher va fatto dopo la commit!!
    print()
    print("scegli il modello di ranking: ")
    print("1) BM25F")
    print("2) PL2")
    choice = int(input())
    if choice == 1:
        searcher = ix.searcher(weighting=whoosh.scoring.BM25F)
示例#21
0
class Trainer:
    def __init__(self, cfg):
        self.cfg = cfg
        self.cat_features = self.cfg.data.features.cat_features
        self.oof = None
        self.raw_preds = None
        self.weights = []
        self.models = []
        self.scores = []
        self.feature_importance_df = pd.DataFrame(
            columns=['feature', 'importance'])
        self.dh = DataHandler()

    def train(self, train_df: pd.DataFrame, target_df: pd.DataFrame,
              fold_df: pd.DataFrame):
        self.oof = np.zeros(len(train_df))

        for fold_, col in enumerate(fold_df.columns):
            print(
                f'\n========================== FOLD {fold_} ... ==========================\n'
            )
            logging.debug(
                f'\n========================== FOLD {fold_} ... ==========================\n'
            )

            self._train_fold(train_df, target_df, fold_df[col])

        print('\n\n===================================\n')
        print(f'CV: {np.mean(self.scores):.4f}')
        print('\n===================================\n\n')
        logging.debug('\n\n===================================\n')
        logging.debug(f'CV: {np.mean(self.scores):.4f}')
        logging.debug('\n===================================\n\n')

        return np.mean(self.scores)

    def _train_fold(self, train_df, target_df, fold):
        tr_x, va_x = train_df[fold == 0], train_df[fold > 0]
        tr_y, va_y = target_df[fold == 0], target_df[fold > 0]
        weight = fold.max()
        self.weights.append(weight)

        model = factory.get_model(self.cfg.model)
        model.fit(tr_x, tr_y, va_x, va_y, self.cat_features)
        va_pred = model.predict(va_x, self.cat_features)

        if self.cfg.data.target.reconvert_type:
            va_y = getattr(np, self.cfg.data.target.reconvert_type)(va_y)
            va_pred = getattr(np, self.cfg.data.target.reconvert_type)(va_pred)
            va_pred = np.where(va_pred >= 0, va_pred, 0)

        self.models.append(model)
        self.oof[va_x.index] = va_pred.copy()

        score = factory.get_metrics(self.cfg.common.metrics.name)(va_y,
                                                                  va_pred)
        self.scores.append(score)

        if self.cfg.model.name in ['lightgbm', 'catboost', 'xgboost']:
            importance_fold_df = pd.DataFrame()
            fold_importance = model.extract_importances()
            importance_fold_df['feature'] = train_df.columns
            importance_fold_df['importance'] = fold_importance
            self.feature_importance_df = pd.concat(
                [self.feature_importance_df, importance_fold_df], axis=0)

    def predict(self, test_df):
        preds = np.zeros(len(test_df))
        for fold_, model in enumerate(self.models):
            pred = model.predict(test_df, self.cat_features)
            if self.cfg.data.target.reconvert_type:
                pred = getattr(np, self.cfg.data.target.reconvert_type)(pred)
                pred = np.where(pred >= 0, pred, 0)
            preds += pred.copy() * self.weights[fold_]
        self.raw_preds = preds.copy()
        return preds

    def save(self, run_name):
        log_dir = Path(f'../logs/{run_name}')
        self.dh.save(log_dir / 'oof.npy', self.oof)
        self.dh.save(log_dir / 'raw_preds.npy', self.raw_preds)
        self.dh.save(log_dir / 'importance.csv', self.feature_importance_df)
        self.dh.save(log_dir / 'model_weight.pkl', self.models)
示例#22
0
from utils import (DataHandler, Kaggle, Notion, Timer, make_submission,
                   seed_everything, send_line)

warnings.filterwarnings('ignore')

# ===============
# Settings
# ===============
parser = argparse.ArgumentParser()
parser.add_argument('--common', default='../configs/common/compe.yml')
parser.add_argument('--notify', default='../configs/common/notify.yml')
parser.add_argument('-m', '--model')
parser.add_argument('-c', '--comment')
options = parser.parse_args()

dh = DataHandler()
cfg = dh.load(options.common)
cfg.update(dh.load(f'../configs/exp/{options.model}.yml'))

notify_params = dh.load(options.notify)

comment = options.comment
model_name = options.model
now = datetime.datetime.now()
run_name = f'{model_name}_{now:%Y%m%d%H%M%S}'

logger_path = Path(f'../logs/{run_name}')


# ===============
# Main
示例#23
0
class Solver:
    def __init__(self, params):

        # Build data handler
        self.data_handler = DataHandler()
        self.data_handler.loadData(params['input'])
        params['inp_dim'] = self.data_handler.getDataShape()[
            1]  # inp_dim = 1000
        logging.info("=" * 41)

        # Build model
        self.model = SPINEModel(params)
        self.dtype = torch.FloatTensor
        use_cuda = torch.cuda.is_available()
        if use_cuda:
            self.model.cuda()
            self.dtype = torch.cuda.FloatTensor
        self.optimizer = torch.optim.SGD(self.model.parameters(), lr=0.1)
        logging.info("=" * 41)

    def train(self, params):
        num_epochs, batch_size = params['num_epochs'], params['batch_size']
        optimizer = self.optimizer
        dtype = self.dtype
        for iteration in range(num_epochs):  # for each epoch
            self.data_handler.shuffleTrain()  # 15000 training data shuffled
            num_batches = self.data_handler.getNumberOfBatches(
                batch_size)  # num_batches = number of iterations
            epoch_losses = np.zeros(
                5)  # rl, asl, psl, total !!!!!!!!!!!!!!!!!!
            for batch_idx in range(num_batches):  # for each iteration
                optimizer.zero_grad()
                batch_x, batch_y = self.data_handler.getBatch(
                    batch_idx, batch_size, params['noise_level'],
                    params['denoising'])
                batch_x = Variable(torch.from_numpy(batch_x),
                                   requires_grad=False).type(dtype)
                batch_y = Variable(torch.from_numpy(batch_y),
                                   requires_grad=False).type(
                                       dtype)  #dtype = torch.FloatTensor
                out, h, loss, loss_terms = self.model(batch_x, batch_y)
                reconstruction_loss, psl_loss, asl_loss, local_loss = loss_terms  #!!!!!!!!!!!!!!!!!!!!!
                loss.backward()
                optimizer.step()
                #print(local_loss)
                epoch_losses[0] += reconstruction_loss.item()
                epoch_losses[1] += asl_loss.item()
                epoch_losses[2] += psl_loss.item()
                epoch_losses[3] += local_loss.item()  #!!!!!!!!!!!!!!!!!!!!!!!!
                epoch_losses[4] += loss.item()

                # epoch_losses[0]+=reconstruction_loss.data[0]
                # epoch_losses[1]+=asl_loss.data[0]
                # epoch_losses[2]+=psl_loss.data[0]
                # epoch_losses[3]+=local_loss.data[0]
                # epoch_losses[4]+=loss.data[0]
            print("After epoch %r, Reconstruction Loss = %.4f, ASL = %.4f,"\
               "PSL = %.4f, Local Loss = %.4f and total = %.4f"
               %(iteration+1, epoch_losses[0], epoch_losses[1], epoch_losses[2], epoch_losses[3], epoch_losses[4]) ) #!!!!!!
            #logging.info("After epoch %r, Sparsity = %.1f"
            #			%(iteration+1, utils.compute_sparsity(h.cpu().data.numpy())))
            #break
            #break

    def getSpineEmbeddings(self, batch_size, params):
        ret = []
        self.data_handler.resetDataOrder()
        num_batches = self.data_handler.getNumberOfBatches(batch_size)
        for batch_idx in range(num_batches):
            batch_x, batch_y = self.data_handler.getBatch(
                batch_idx, batch_size, params['noise_level'],
                params['denoising'])
            batch_x = Variable(torch.from_numpy(batch_x),
                               requires_grad=False).type(self.dtype)
            batch_y = Variable(torch.from_numpy(batch_y),
                               requires_grad=False).type(self.dtype)
            _, h, _, _ = self.model(batch_x, batch_y)
            ret.extend(h.cpu().data.numpy())
        return np.array(ret)

    def getWordsList(self):
        return self.data_handler.getWordsList()
示例#24
0
class Solver:
    def __init__(self, params):

        # Build data handler
        self.data_handler = DataHandler()
        self.data_handler.loadData(params['input'])
        params['inp_dim'] = self.data_handler.getDataShape()[1]
        logging.info("=" * 41)

        # Build model
        self.model = SPINEModel(params)
        self.dtype = torch.FloatTensor
        use_cuda = torch.cuda.is_available()
        if use_cuda:
            self.model.cuda()
            self.dtype = torch.cuda.FloatTensor
        self.optimizer = torch.optim.SGD(self.model.parameters(), lr=0.1)
        logging.info("=" * 41)

    def train(self, params):
        num_epochs, batch_size = params['num_epochs'], params['batch_size'],
        optimizer = self.optimizer
        dtype = self.dtype
        for iteration in range(num_epochs):
            self.data_handler.shuffleTrain()
            num_batches = self.data_handler.getNumberOfBatches(batch_size)
            epoch_losses = np.zeros(5)  # rl, asl, psl, Siml, total
            sparsity = 0
            for batch_idx in range(num_batches):
                optimizer.zero_grad()
                batch_x, batch_y = self.data_handler.getBatch(
                    batch_idx, batch_size, params['noise_level'],
                    params['denoising'])
                batch_x = Variable(torch.from_numpy(batch_x),
                                   requires_grad=False).type(dtype)
                batch_y = Variable(torch.from_numpy(batch_y),
                                   requires_grad=False).type(dtype)
                out, h, loss, loss_terms, sparsity_ratio = self.model(
                    batch_x, batch_y)
                reconstruction_loss, psl_loss, asl_loss, siml = loss_terms
                loss.backward()
                optimizer.step()
                epoch_losses[0] += reconstruction_loss.data
                epoch_losses[1] += asl_loss.data
                epoch_losses[2] += psl_loss.data
                epoch_losses[3] += loss.data
                epoch_losses[4] += siml.data
                sparsity += sparsity_ratio.data
            print("After epoch %r, Reconstruction Loss = %.4f, ASL = %.4f,"\
               "PSL = %.4f, SimL = %.4f , and total = %.4f, sparsity = %.4f"
               %(iteration+1, epoch_losses[0], epoch_losses[1], epoch_losses[2], epoch_losses[4], epoch_losses[3], sparsity/num_batches) )
            if iteration % 1000 == 0:
                spine_embeddings = self.getSpineEmbeddings(512, params)
                utils.dump_vectors(spine_embeddings,
                                   './' + str(iteration / 1000) + '.txt',
                                   self.getWordsList())

            #logging.info("After epoch %r, Sparsity = %.1f"
            #			%(iteration+1, utils.compute_sparsity(h.cpu().data.numpy())))
            #break
            #break

    def getSpineEmbeddings(self, batch_size, params):
        ret = []
        self.data_handler.resetDataOrder()
        num_batches = self.data_handler.getNumberOfBatches(batch_size)
        for batch_idx in range(num_batches):
            batch_x, batch_y = self.data_handler.getBatch(
                batch_idx, batch_size, params['noise_level'],
                params['denoising'])
            batch_x = Variable(torch.from_numpy(batch_x),
                               requires_grad=False).type(self.dtype)
            batch_y = Variable(torch.from_numpy(batch_y),
                               requires_grad=False).type(self.dtype)
            _, h, _, _, spars = self.model(batch_x, batch_y)
            ret.extend(h.cpu().data.numpy())
        return np.array(ret)

    def getWordsList(self):
        return self.data_handler.getWordsList()
示例#25
0
 def exit_press(self):
     # Save portfolio
     DataHandler.save_portfolio(current_portoflio.portfolio)
     # Exit
     sys.exit(0)
示例#26
0
def train(opt, model, input_img):
    model.cuda()
    
    handler = DataHandler(opt, input_img)
    
    learning_rate = opt.learning_rate
    min_learning_rate = opt.min_learning_rate
    learning_rate_change_iter_nums = [0]
    mse_steps = []
    mse_rec = []
    
    criterionL1 = nn.L1Loss()
    optimizer = torch.optim.Adam(model.parameters(), lr=learning_rate)
    
    
    
    with tqdm.tqdm(miniters=1, mininterval=0) as progress:
        for iter, (hr, lr) in enumerate(handler.preprocess_data()):
            lr = lr.cuda()
            hr = hr.cuda()
            
            output = model(lr) + lr
            loss = criterionL1(output, hr)
            
            cpu_loss = loss.data.cpu().numpy()
            
            
            
            model.zero_grad()
            optimizer.zero_grad()
            
            progress.set_description("Iteration: {} Loss: {}, Learning rate: {}".format( \
                iter, cpu_loss, learning_rate))
            progress.update()
            
            if iter > 0 and iter % 10000 == 0:
                learning_rate = learning_rate / 10
                adjust_learning_rate(optimizer, new_lr=learning_rate)
                print("Learning rate reduced to {lr}".format(lr=learning_rate) )
            """
            if (not (1 + iter) % opt.learning_rate_policy_check_every
                and iter - learning_rate_change_iter_nums[-1] > opt.min_iters):
                [slope, _], [[var, _], _] = np.polyfit(mse_steps[-int(opt.learning_rate_slope_range /
                                                                    opt.run_test_every):],
                                                        mse_rec[-int(opt.learning_rate_slope_range /
                                                                    opt.run_test_every):],
                                                        1, cov=True)
                
                std = np.sqrt(var)
                
                if -opt.learning_rate_change_ratio * slope < std:
                    learning_rate /= 10
                    learning_rate_change_iter_nums.append(iter)
            """
                
            loss.backward()
            optimizer.step()
            
            if learning_rate < min_learning_rate:
                print('Done training')
                break