Пример #1
0
    def validate(self, dev_word_lists, dev_tag_lists, word2id, tag2id):
        self.model.eval()
        with torch.no_grad():
            val_losses = 0.
            val_step = 0
            for ind in range(0, len(dev_word_lists), self.batch_size):
                val_step += 1
                # 准备batch数据
                batch_sents = dev_word_lists[ind:ind + self.batch_size]
                batch_tags = dev_tag_lists[ind:ind + self.batch_size]
                tensorized_sents, lengths = tensorized(batch_sents, word2id)
                tensorized_sents = tensorized_sents.to(self.device)
                targets, lengths = tensorized(batch_tags, tag2id)
                targets = targets.to(self.device)

                # forward
                scores = self.model(tensorized_sents, lengths)

                # 计算损失
                loss = self.cal_loss_func(scores, targets,
                                          tag2id).to(self.device)
                val_losses += loss.item()
            val_loss = val_losses / val_step

            if val_loss < self._best_val_loss:
                print("保存模型...")
                save_model(self.model,
                           self.args.save_model + '/bilstm_crf.ckpt')

                self._best_val_loss = val_loss

            return val_loss
Пример #2
0
def train(sess):
	if not IS_ON_NSML:
		with open(FLAGS.map_file, "wb") as f:
			pickle.dump([char_to_id, id_to_char, tag_to_id, id_to_tag], f)

	steps_per_epoch = train_manager.len_data
	early_stop = 0

	logger.info("start training")
	loss = []
	for epoch in range(FLAGS.max_epoch):
		for batch in train_manager.iter_batch(shuffle=True):
			step, batch_loss = model.run_step(sess, True, batch)
			loss.append(batch_loss)
			if step % FLAGS.steps_check == 0:
				iteration = step // steps_per_epoch + 1
				logger.info("iteration:{} step:{}/{}, "
							"loss:{:>9.6f}".format(iteration, step%steps_per_epoch, \
									steps_per_epoch, np.mean(loss)))

		best, dev_f1 = evaluate(sess, model, "dev", dev_manager, id_to_tag, logger)

		# early stopping
		if best: early_stop = 0
		else:
			early_stop += 1
			if early_stop > FLAGS.patience: break

		# save model
		if best:
			save_model(sess, model, FLAGS.ckpt_path, logger)
		if IS_ON_NSML:
			nsml.report(summary=True, scope=locals(), epoch=epoch, epoch_total=FLAGS.max_epoch, train__loss=float(np.mean(loss)), valid__f1score=dev_f1)
			nsml.save(epoch)
		loss = []
Пример #3
0
    def tournament(self, root_state):
        _, scoreboard = self.self_play(root_state, best_only=False,
            num_episodes=config.NUM_TOURNAMENT_EPISODES, deterministic=True)

        if scoreboard["new"] > scoreboard["best"]*config.SCORING_THRESHOLD:
            model_utils.save_model(self.new)
            self.best = model_utils.load_model()
        elif scoreboard["new"]*config.SCORING_THRESHOLD < scoreboard["best"]:
            self.new = model_utils.load_model()
Пример #4
0
def train(sess, context_embeddings_op, elmo_context, elmo_ids, config):
    if not IS_ON_NSML:
        with open(FLAGS.necessary, "wb") as f:
            pickle.dump([
                word_to_id, id_to_word, pumsa_to_id, id_to_pumsa, char_to_id,
                id_to_char, tag_to_id, id_to_tag, pre_to_id, id_to_pre,
                suf_to_id, id_to_suf
            ], f)

    steps_per_epoch = train_manager.len_data
    early_stop = 0

    logger.info("start training")
    loss = []
    for epoch in range(FLAGS.max_epoch):
        for batch in train_manager.iter_batch(shuffle=True):
            step, batch_loss = model.run_step(sess, context_embeddings_op,
                                              elmo_context, elmo_ids, True,
                                              batch)
            loss.append(batch_loss)
            if step % FLAGS.steps_check == 0:
                iteration = step // steps_per_epoch + 1
                logger.info("epoch:{} iteration:{} step:{}/{}, "
                   "loss:{:>9.6f}".format(epoch, iteration, step%steps_per_epoch, \
                     steps_per_epoch, np.mean(loss)))
            # break

        best, dev_f1 = evaluate(sess, context_embeddings_op, elmo_context,
                                elmo_ids, model, "dev", dev_manager, id_to_tag,
                                logger)

        # early stopping
        if best:
            print("best dev_f1 : %s, epoch : %s" % (dev_f1, epoch))
            early_stop = 0
        else:
            print("dev_f1 : %s" % dev_f1)
            early_stop += 1
            if early_stop > FLAGS.patience:
                print("Final best score : %s" % best)
                break

        # save model
        if best:
            save_model(sess, model, FLAGS.ckpt_path, logger)
        if IS_ON_NSML:
            nsml.report(summary=True,
                        scope=locals(),
                        epoch=epoch,
                        epoch_total=FLAGS.max_epoch,
                        train__loss=float(np.mean(loss)),
                        valid__f1score=dev_f1)
            nsml.save(epoch)
        loss = []
Пример #5
0
def train():
    dataset = build_DataLoader()
    vocabulary_list = sorted(dataset.vocabulary.word2index.items(),\
            key=lambda x: x[1])
    save_vocabulary(vocabulary_list)
    vocab_size = dataset.get_vocabulary_size()
    model = build_model(vocab_size, load_ckpt = True)
    print(model)
    optimizer = optim.SGD(model.parameters(), lr = config.learning_rate)

    criterion = nn.CrossEntropyLoss()
    start = time.time()
    total_batch = len(dataset)
    ckpts = get_ckpts()
    iter_idx = 0 if len(ckpts) == 0 else max(ckpts)
    print_loss_total = 0.0

    milestones = init_milestone(total_batch)
    n_iters = milestones[-1]

    scheduler = optim.lr_scheduler.MultiStepLR(optimizer,
            milestones = milestones, gamma=0.5)
    scheduler.step(iter_idx)
    print('Start Training. total: %s iterations'%n_iters)
    while iter_idx < n_iters:
        iter_idx += 1
        scheduler.step()
        input_group, target_group = dataset.random_batch()
        # zero gradients
        optimizer.zero_grad()
        # run seq2seq
        _, loss = model(criterion, input_group, target_group, 
                teacher_forcing_ratio=1)
        print_loss_total += loss.data[0]
        loss.backward()
        clip_grad_norm(model.parameters(), config.clip)
        # update parameters
        optimizer.step()

        if iter_idx % config.print_every == 0:
            test_loss = model_evaluate(model, criterion, dataset)
            print_summary(start, iter_idx, n_iters,\
                    math.exp(print_loss_total / config.print_every),\
                    optimizer.param_groups[0]['lr']) 
            print('Test loss: %.4f ' % (math.exp(test_loss)))
            print_loss_total = 0.0
            # hot_update_lr(optimizer)
        if iter_idx % config.save_every == 0:
            save_model(model, iter_idx)
        # break
    save_model(model, iter_idx)
Пример #6
0
def main():
    in_args = utils.get_model_args()
        
    # load the model from the --arch and --hidden_units parameters
    print("Loading the model...")
    model = model_utils.load_model(in_args.arch, in_args.hidden_units)

    # train the model
    print("Now training the model...")
    model = model_utils.train_model(in_args.arch, model, in_args.learn_rate,in_args.epochs,device='cuda' if in_args.gpu else 'cpu')
    
    #save the model
    print("Saving the model to {}".format(in_args.save_dir))
    model_utils.save_model(model,in_args.arch,in_args.epochs,in_args.gpu,in_args.learn_rate,in_args.save_dir,in_args.output_size)
Пример #7
0
def main():
    parser = argparse.ArgumentParser()
    add_train_args(parser)
    add_common_args(parser)
    args = parser.parse_args()
    add_experiment(args)
    device = model_utils.get_device()

    # Load dataset from disk
    train_ds, dev_ds = model_utils.load_training_data(args)

    # Initialize a model
    model = models.get_model(args.model)(size=args.size)

    # load from checkpoint if path specified
    if args.load_path is not None:
        model = model_utils.load_model(model, args.load_path)

    # Move model to GPU if necessary
    model.to(device)

    # Initialize optimizer
    optimizer = optim.Adam(
        model.parameters(),
        lr=args.learning_rate,
        weight_decay=args.weight_decay,
    )

    # Scheduler
    scheduler = optim.lr_scheduler.StepLR(optimizer, 5, 0.1, verbose=True)

    os.makedirs(f'{args.save_path}/{args.experiment}')
    print(f'Created new experiment: {args.experiment}')
    save_arguments(args, f'{args.save_path}/{args.experiment}/args.txt')

    # Train!
    trained_model = train_model(
        train_ds,
        dev_ds,
        model,
        optimizer,
        scheduler,
        args,
    )

    # Save trained model
    filename = f'{args.save_path}/{args.experiment}/{model.__class__.__name__}_trained.checkpoint'
    model_utils.save_model(trained_model, filename)
Пример #8
0
def train_fn(model, data_loader, optimizer, save_model=False):
    model.train()
    fin_loss = 0
    tk = tqdm(data_loader, total=len(data_loader))
    for data in tk:
        for key, value in data.items():
            data[key] = value.to(config.DEVICE)
        optimizer.zero_grad()
        _, loss = model(**data)
        loss.backward()
        optimizer.step()
        fin_loss += loss.item()

    if save_model:
        model_utils.save_model(model, optimizer, loss, config.CHECKPOINT_PATH)

    return fin_loss / len(data_loader)
Пример #9
0
def train(sess):
	logger.info("start training")

	loss = []
	best_dev = ""

	steps_per_epoch = train_manager.len_data
	early_stop = 0

	writer = tf.summary.FileWriter(config.summary_path, sess.graph)

	for epoch in range(config.max_epoch):
		for _, batch in enumerate(train_manager.iter_batch(shuffle= True)):
			step, batch_loss, summary = SRL_Model.run_step(sess, ELMo_context, ELMo_ids, True, batch)
			loss.append(batch_loss)
			if step % config.steps_check == 0:
				iteration = step // steps_per_epoch + 1
				logger.info("epoch:{} iteration:{} step:{}/{}, "hghg
							"loss:{:>9.6f}".format(epoch, iteration, step % steps_per_epoch, \
												   steps_per_epoch, np.mean(loss)))
		writer.add_summary(summary, step)

		best, dev_acc, final_report = evaluate(sess, SRL_Model, "dev", test_manager, idx2label, logger)

		if final_report != None:
			best_dev = final_report

		if best:
			print("best dev_f1 : %s, epoch : %s" %(dev_acc, epoch))
			early_stop = 0
			save_model(sess, SRL_Model, logger)

		else:
			print("dev_f1 : %s" % dev_acc)
			early_stop += 1
			if early_stop > config.patience:

				print("Final best test score : %s" % best)
				print("============DEV=============")

				for line in best_dev:
					logger.info(line.strip())
				break
		loss = []
Пример #10
0
def main():

    midi_dir = '../../../data/query_symlinks'

    model_num = 12
    model_dir = '../../../models/keras/01_vanilla_rnn/{}'.format(model_num)

    window_size = 20

    # only creates if doesn't already exist
    model_utils.create_model_dir(model_dir)

    files = [os.path.join(midi_dir, path) for path in os.listdir(midi_dir)]
    train_generator = data_utils.get_data_generator(files[0:1000], 
                                                    form=FORMAT, 
                                                    window_size=20)

    val_generator = data_utils.get_data_generator(files[1000:1100],
                                                  form=FORMAT, 
                                                  window_size=20)
    
    model, epoch = get_model(window_size=window_size)
    print(model.summary())
    model_utils.save_model(model, model_dir)
    
    callbacks = model_utils.get_callbacks(model_dir)
    
    print('fitting model...')
    model.fit_generator(train_generator,
                        steps_per_epoch=10000, 
                        epochs=10,
                        validation_data=val_generator, 
                        validation_steps=2000,
                        verbose=1, 
                        callbacks=callbacks,
                        initial_epoch=epoch)
    
    # generate 10 tracks using random seeds
    X, y = val_generator.next()
    generated = model_utils.generate(model, X)
    for i, midi in enumerate(generated):
        file = os.path.join(model_dir, 'generated', '{}.mid'.format(i + 1))
        midi.write(file.format(i + 1))
        print('wrote midi file to {}'.format(file))
Пример #11
0
def train():
    data_set = build_data_loader(batch_size=BATCH_SIZE)
    vocabulary_list = sorted(data_set.vocabulary.word2index.items(),
                             key=lambda x: x[1])
    save_vocabulary(vocabulary_list)
    vocab_size = data_set.get_vocabulary_size()
    model = build_model(vocab_size)
    model_optimizer = optim.Adam(model.parameters(), lr=LEARNING_RATE)

    start = time.time()
    data_set_len = len(data_set)
    epoch = 0
    print_loss_total = 0.0
    print('Start Training.')
    while epoch < N_EPOCHS:
        epoch += 1
        input_group, target_group = data_set.random_batch()
        # zero gradients
        model_optimizer.zero_grad()
        # run seq2seq
        all_decoder_outputs = model(input_group,
                                    target_group,
                                    teacher_forcing_ratio=1)
        target_var, target_lens = target_group
        # loss calculation and back-propagation
        loss = masked_cross_entropy(
            all_decoder_outputs.transpose(0, 1).contiguous(),
            target_var.transpose(0, 1).contiguous(), target_lens)
        print_loss_total += loss.data
        loss.backward()
        clip_grad_norm_(model.parameters(), CLIP)
        # update parameters
        model_optimizer.step()

        if epoch % PRINT_EVERY == 0:
            test_loss = model_evaluate(model, data_set)
            print_summary(start, epoch,
                          math.exp(print_loss_total / PRINT_EVERY))
            print('Test PPL: %.4f' % math.exp(test_loss))
            print_loss_total = 0.0
            if epoch % SAVE_EVERY == 0:
                save_model(model, epoch)
        # break
    save_model(model, epoch)
Пример #12
0
def train_loop(model, criterion, optimizer, scheduler, trainloader,
               epochs=100, epoch_start=0, T_print=200, T_save=10):
    T_start = time.time()
    for epoch in range(epoch_start, epochs):
        running_loss = 0.0
        running_loss_mini = 0.0
        for i, (inputs, targets) in enumerate(trainloader):
            # zero the parameter gradients
            optimizer.zero_grad()

            # forward + backward + optimize
            outputs = model(inputs)

            # remove the channel dimension
            targets = torch.argmax(targets, dim=1) # convert to (N, H, W)

            loss = criterion(outputs, targets)
            loss.backward()
            optimizer.step()

            running_loss += loss.item()
            running_loss_mini += loss.item()

            if i % T_print == T_print-1:
                T_end = time.time()
                print('%d-th minibatch\tloss: %f' % (i+1, running_loss/T_print), end='\t')
                print(T_end-T_start, 'secs elapsed')
                running_loss_mini = 0.0

        # call scheduler every epoch
        scheduler.step()

        # print statistics
        T_end = time.time()
        print('epoch %3d\tloss: %f' % (epoch + 1, running_loss))
        print(T_end-T_start, 'secs elapsed')

        # save
        if epoch % T_save == T_save-1:
            save_model(model, weights_dir, weight_fname)

    print("Done!")
Пример #13
0
def new_models(mt):
    print("Creating new models")
    w1 = np.random.normal(0.0, 0.1, (784, FLAGS.hidden))
    b1 = np.random.normal(0.0, 0.1, (FLAGS.hidden))
    w2 = np.random.normal(0.0, 0.1, (FLAGS.hidden, NUM_OUTPUT))
    b2 = np.random.normal(0.0, 0.1, (NUM_OUTPUT))
    architecture = [FLAGS.hidden, NUM_OUTPUT]
    gold = AgentModel(architecture)
    gold.set_vars([(w1, b1), (w2, b2)])
    print("Training gold...")
    gold.train_model(mt.all_train, mt.all_test)
    model_utils.save_model(gold, "gold")

    digits1 = AgentModel(architecture)
    digits1.set_vars([(w1, b1), (w2, b2)])
    print("Training mnist1 digits...")
    digits1.train_model(mt.mnist1_train, mt.mnist1_test)
    model_utils.save_model(digits1, "digit1")

    digits2 = AgentModel(architecture)
    digits2.set_vars([(w1, b1), (w2, b2)])
    print("Training mnist2 digits...")
    digits2.train_model(mt.mnist2_train, mt.mnist2_test)
    model_utils.save_model(digits2, "digit2")
    return digits1, digits2, gold
Пример #14
0
def s2s_fit(
    s2s_model,
    dataloader,
    save_epoch_freq,
    model_save_path=None,
    epochs=1,
    teacher_forcing=0.5,
    tb_expt=None,
    print_epoch_results=True,
):
    """
    s2s_model: :class:`Seq2SeqAutoEncoder`
    dataloader: :class:`SentDataloader` yields train_sents, dev_sents
        train_sents, dev_sents: :class:`preprocessing.BatchSentIxs`
    save_epoch_freq: If 0 or None, we never save the model.
    save_path: If save_epoch_freq is truthy, this must be a valid path.
    """
    if save_epoch_freq:
        assert model_save_path is not None
    epoch_stats_list = []
    for epoch_num in tqdm.tqdm_notebook(range(epochs), desc='Epochs'):
        epoch_stats = run_epoch(
            s2s_model=s2s_model,
            dataloader=dataloader,
            teacher_forcing=teacher_forcing,
        )
        log_losses(
            epoch_stats=epoch_stats,
            tb_expt=tb_expt,
            epoch_num=epoch_num,
            print_epoch_results=print_epoch_results,
        )
        epoch_stats_list.append(epoch_stats)
        # TODO: Dont do any lr decay
        # s2s_model.lr_scheduler.step(e_loss)
        if save_epoch_freq and epoch_num % save_epoch_freq == 0:
            log.info('Saving model to `{}`...'.format(model_save_path))
            mu.save_model(model=s2s_model, path=model_save_path)
            log.info('Saved model to `{}`.'.format(model_save_path))
    return epoch_stats_list
Пример #15
0
def new_models(mt):
    print("Creating new models")
    w1 = np.random.normal(0.0, 0.1, (784, FLAGS.hidden))
    b1 = np.random.normal(0.0, 0.1, (FLAGS.hidden))
    w2 = np.random.normal(0.0, 0.1, (FLAGS.hidden, NUM_OUTPUT))
    b2 = np.random.normal(0.0, 0.1, (NUM_OUTPUT))
    gold = FlexibleModel(FLAGS.hidden)
    gold.set_vars(w1, b1, w2, b2)
    print("Training gold...")
    gold.train_model(mt.all_train, mt.all_test)
    model_utils.save_model(gold, "gold")

    digits1 = FlexibleModel(FLAGS.hidden)
    digits1.set_vars(w1, b1, w2, b2)
    print("Training mnist1 digits...")
    digits1.train_model(mt.mnist1_train, mt.mnist1_test)
    model_utils.save_model(digits1, "digit1")

    digits2 = FlexibleModel(FLAGS.hidden)
    digits2.set_vars(w1, b1, w2, b2)
    print("Training mnist2 digits...")
    digits2.train_model(mt.mnist2_train, mt.mnist2_test)
    model_utils.save_model(digits2, "digit2")
    return digits1, digits2, gold
Пример #16
0
    input_units = model.classifier[0].in_features
    model.name = 'vgg16'
elif pre_tr_model == 'vgg19':
    input_units = model.classifier[0].in_features
    model.name = 'vgg19'
elif pre_tr_model == 'densenet':
    input_units = model.classifier.in_features
    model.name = 'densenet'
elif pre_tr_model == 'alexnet':
    input_units = model.classifier[1].in_features
    model.name = 'alexnet'

#building classifier of model
model = build_classifier(model, input_units, hidden_units, dropout)
print(model)

#Set criterion and optimizer
criterion = nn.NLLLoss()
optimizer = optim.Adam(model.classifier.parameters(), learning_rate)
model.to(device)

# Training model
model = train_model(model, epochs, trainloader, validloader, criterion,
                    optimizer, device)

# Testing model
test_model(model, testloader, device)

# Saving model
save_model(model, train_data, save_dir)
Пример #17
0
def train_model(config):
    if config.start_date is not None:
        print("Training start date: ", config.start_date)
    if config.start_date is not None:
        print("Training end date: ", config.end_date)

    print("Loading training data from %s ..." % config.datafile)
    train_data = None
    valid_data = None

    data_path = os.path.join(config.data_dir, config.datafile)
    batches = BatchGenerator(data_path, config, is_training_only=True)

    train_data = batches.train_batches(verbose=True)
    valid_data = batches.valid_batches(verbose=True)

    tf_config = tf.ConfigProto(allow_soft_placement=True,
                               log_device_placement=False)

    with tf.Graph().as_default(), tf.Session(config=tf_config) as session:
        if config.seed is not None:
            tf.set_random_seed(config.seed)

        print("Constructing model ...")
        model = model_utils.get_model(session, config, verbose=True)

        params = model_utils.get_scaling_params(config,
                                                train_data,
                                                verbose=True)
        model.set_scaling_params(session, **params)

        noise_model = None

        if config.early_stop is not None:
            print("Training will early stop without "
                  "improvement after %d epochs." % config.early_stop)
        sys.stdout.flush()

        train_history = list()
        valid_history = list()

        lr = model.set_learning_rate(session, config.learning_rate)

        train_data.cache(verbose=True)
        valid_data.cache(verbose=True)

        for i in range(config.max_epoch):

            (train_mse, valid_mse) = run_epoch(session,
                                               model,
                                               train_data,
                                               valid_data,
                                               keep_prob=config.keep_prob,
                                               passes=config.passes,
                                               noise_model=noise_model,
                                               verbose=True)
            print((
                'Epoch: %d Train MSE: %.6f Valid MSE: %.6f Learning rate: %.4f'
            ) % (i + 1, train_mse, valid_mse, lr))
            sys.stdout.flush()

            train_history.append(train_mse)
            valid_history.append(valid_mse)

            if re.match("Gradient|Momentum", config.optimizer):
                lr = model_utils.adjust_learning_rate(session, model, lr,
                                                      config.lr_decay,
                                                      train_history)

            if not os.path.exists(config.model_dir):
                print("Creating directory %s" % config.model_dir)
                os.mkdir(config.model_dir)

            if math.isnan(valid_mse):
                print("Training failed due to nan.")
                quit()
            elif stop_training(config, valid_history):
                print("Training stopped.")
                quit()
            else:
                if ((config.early_stop is None)
                        or (valid_history[-1] <= min(valid_history))):
                    model_utils.save_model(session, config, i)
Пример #18
0
                       kernel_initializer='random_normal',
                       bias_initializer='random_normal'))
model.add(
    keras.layers.Dense(8,
                       activation='relu',
                       kernel_initializer='random_normal',
                       bias_initializer='random_normal'))
model.add(
    keras.layers.Dense(1,
                       kernel_initializer='random_normal',
                       bias_initializer='random_normal'))

# construct signals
N = 100
x = 500 * np.sin(np.arange(N) * np.pi * 0.1)
y = model(x.reshape(-1, 1))
y = y.numpy()

# plot signals
plt.figure()
plt.plot(x)
plt.plot(y, '--')
plt.ylim(-1.1, 1.1)
plt.savefig('python/dense.png')

# save signals
np.savetxt('test_data/dense_x_python.csv', x, delimiter=',')
np.savetxt('test_data/dense_y_python.csv', y, delimiter=',')

save_model(model, 'models/dense.json')
Пример #19
0
def train(train_data, dev_data, model, args):
    timestamp = str(int(time.time() * 1e7))
    out_dir = os.path.abspath(
        os.path.join(os.path.curdir, "tmp-runs", timestamp))
    print("Saving the model to {}\n".format(out_dir))
    if not os.path.exists(out_dir):
        os.makedirs(out_dir)

    best = 100
    best_path = ""
    sub_cycle = 0

    optimizer, scheduler = _init_optimizer(model, args)

    tar_train_batches = None if (args.mode == 'train_clf' or args.mode == 'test_clf') else \
            data_utils.data_loader(train_data[args.tar_dataset], args.batch_size, oneEpoch=False)
    src_unlbl_train_batches = None if (args.mode == 'train_clf' or args.mode == 'test_clf') else \
            data_utils.data_loader(train_data[args.src_dataset[0]], args.batch_size, oneEpoch=False)
    src_train_batches = data_utils.data_dict_loader(train_data,
                                                    args.src_dataset,
                                                    args.batch_size)

    tar_dev_data = None if args.tar_dataset == '' else dev_data[
        args.tar_dataset]

    ep = 1
    while True:
        start = time.time()

        train_res = []

        if args.dispatcher:
            for i in range(args.epoch_size):
                cur_res = train_batch(model, next(src_train_batches),
                                      src_unlbl_train_batches,
                                      tar_train_batches, optimizer, args)
                train_res.append(cur_res)

        else:
            for batch in tqdm(range(args.epoch_size), dynamic_ncols=True):
                cur_res = train_batch(model, next(src_train_batches),
                                      src_unlbl_train_batches,
                                      tar_train_batches, optimizer, args)
                train_res.append(cur_res)

        end = time.time()
        print("\n{}, Updates {:5d}, Time Cost: {} seconds".format(
            datetime.datetime.now().strftime('%02y/%02m/%02d %H:%M:%S'),
            ep * args.epoch_size, end - start))

        _print_train_res(train_res, args)

        # evaluate on dev set
        print('===  DEV  ===')
        dev_res = []
        for task in args.src_dataset:
            writer = open(
                os.path.join(out_dir, str(ep)) + '.' + task + '.out', 'w')
            cur_res = evaluate_task(dev_data[task],
                                    task,
                                    tar_dev_data,
                                    model,
                                    optimizer,
                                    args,
                                    writer=writer)
            writer.close()
            dev_res.append(cur_res)

            scheduler[task].step(cur_res['loss_lbl'])

        dev_res = print_dev_res(dev_res, args)

        # adjust the encoder loss based on avg. loss lbl plus avg. loss wd
        scheduler['encoder'].step(dev_res['loss_encoder'])

        # adjust the encoder loss based on avg. r2a loss
        scheduler['r2a'].step(dev_res['loss_r2a'])

        if (args.mode != 'train_clf' and dev_res['loss_lbl_r2a'] < best) or\
                (args.mode == 'train_clf' and dev_res['loss_lbl'] < best):

            best = dev_res[
                'loss_lbl_r2a'] if args.mode != 'train_clf' else dev_res[
                    'loss_lbl']

            best_path = os.path.join(out_dir, str(ep))
            model_utils.save_model(model, best_path)
            sub_cycle = 0
        else:
            sub_cycle += 1

        if sub_cycle == args.patience * 2:
            break

        ep += 1

    print("End of training. Restore the best weights")
    model = model_utils.load_saved_model(best_path, args)

    print('===  BEST DEV  ===')
    dev_res = []
    for task in args.src_dataset:
        cur_res = evaluate_task(dev_data[task], task, tar_dev_data, model,
                                None, args)
        dev_res.append(cur_res)

    dev_res = print_dev_res(dev_res, args)

    print("Deleting model snapshot")
    os.system("rm -rf {}/*".format(out_dir))  # delete model snapshot for space

    if args.save:
        print("Save the best model to director saved-runs")
        best_dir = os.path.abspath(os.path.join(os.path.curdir, "saved-runs", args.mode, \
            "-".join(args.src_dataset) + '_' + args.tar_dataset + '_' + timestamp))

        if not os.path.exists(best_dir):
            os.makedirs(best_dir)

        best_dir = os.path.join(best_dir, 'best')
        model_utils.save_model(model, best_dir)

        with open(best_dir + '_args.txt', 'w') as f:
            for attr, value in sorted(args.__dict__.items()):
                f.write("{}={}\n".format(attr.upper(), value))

        return dev_res, best_dir, model

    return dev_res, out_dir, model
Пример #20
0
iterstion = step // steps_per_epoch + 1

logger.info("iteration:{} step{}/{},NER loss:{:>9.6f}".format(iterstion, step%steps_per_epoch, steps_per_epoch, np.mean(loss)))

loss = []



best = evaluate(sess,model,"dev", dev_manager, id_to_tag, logger)



if best:

model_utils.save_model(sess, model, FLAGS.ckpt_path, logger)

evaluate(sess, model, "test", test_manager, id_to_tag, logger)












Пример #21
0
def main():

    midi_dir = '../../../data/t-sne_selections/1/0/'

    model_num = 7  # same as 3
    model_dir = '../../../models/keras/' \
                '03_vanilla_rnn_intervals/{}'.format(model_num)

    window_size = 20

    # only creates if doesn't already exist
    model_utils.create_model_dir(model_dir)

    files = [os.path.join(midi_dir, path) for path in os.listdir(midi_dir)]

    val_split = 0.2
    print(int(float(len(files)) * val_split))
    train_generator = data_utils.get_data_generator(
        files[0:int(float(len(files)) * val_split)],
        form=FORMAT,
        window_size=20)

    val_generator = data_utils.get_data_generator(
        files[int(float(len(files)) * val_split):],
        form=FORMAT,
        window_size=20)

    # intervals = []

    # for i in range(1000):
    #     data = train_generator.next()
    #     for window in data[0]:
    #         for interval in window:
    #             if interval not in intervals:
    #                 intervals.append(interval)

    # pdb.set_trace()

    # for i in range(1000):
    #     data = train_generator.next()
    #     pdb.set_trace()

    model, epoch = get_model(window_size=window_size)
    print(model.summary())
    model_utils.save_model(model, model_dir)

    callbacks = model_utils.get_callbacks(model_dir)

    # print('fitting model...')
    model.fit_generator(train_generator,
                        steps_per_epoch=1000,
                        epochs=100,
                        validation_data=val_generator,
                        validation_steps=200,
                        verbose=1,
                        callbacks=callbacks,
                        initial_epoch=epoch)

    # generate 10 tracks using random seeds
    X, y = val_generator.next()
    generated = model_utils.generate_notes_from_intervals(model, X, length=200)
    for i, midi in enumerate(generated):
        file = os.path.join(model_dir, 'generated', '{}.mid'.format(i + 1))
        midi.write(file.format(i + 1))
        print('wrote midi file to {}'.format(file))
Пример #22
0
def ppo(args):
    env = environ.GymEnvironment(args.dir_path,
                                 args.env_name,
                                 'ppo_log',
                                 args.model_name,
                                 skip_frames=6)
    env_render = environ.GymEnvironment(args.dir_path,
                                        args.env_name,
                                        'ppo_log_render',
                                        args.model_name,
                                        record=True,
                                        render=args.render)
    fps = env_render.env.metadata.get('video.frames_per_second', 30)
    logging.info(str(env))
    brain_name = env.external_brain_names[0]
    tf.reset_default_graph()
    ppo_model = model_utils.create_agent_model(env,
                                               args.beta,
                                               args.epsilon,
                                               args.hidden_units,
                                               args.learning_rate,
                                               args.max_steps,
                                               args.normalize_steps,
                                               args.num_layers)
    is_continuous = env.brains[brain_name].action_space_type == 'continuous'
    use_observations = False
    use_states = True
    model_path = os.path.join(args.dir_path, 'models', args.model_name)
    if not os.path.exists(model_path):
        os.makedirs(model_path)
    tf.set_random_seed(np.random.randint(1024))
    init = tf.global_variables_initializer()
    saver = tf.train.Saver(max_to_keep=args.keep_checkpoints)
    with tf.Session() as sess:
        # Instantiate model parameters
        if args.load_model:
            logging.info('model:loading')
            ckpt = tf.train.get_checkpoint_state(model_path)
            if ckpt is None:
                logging.error('model could not be found:{}'.format(model_path))
            saver.restore(sess, ckpt.model_checkpoint_path)    # pylint:disable=E1101
        else:
            sess.run(init)
        steps, _ = sess.run([ppo_model.global_step, ppo_model.last_reward])
        summary_writer = tf.summary.FileWriter(model_path)
        info = env.reset()[brain_name]
        trainer = ppo_tnr.Trainer(ppo_model,
                                  sess,
                                  info,
                                  is_continuous,
                                  use_observations,
                                  use_states,
                                  args.train_model)
        trainer_monitor = ppo_tnr.Trainer(ppo_model,
                                          sess,
                                          info,
                                          is_continuous,
                                          use_observations,
                                          use_states,
                                          training=False)
        render_started = False
        while steps <= args.max_steps or not args.train_model:
            if env.global_done:
                info = env.reset()[brain_name]
                trainer.reset_buffers(info, total=True)
            if not render_started and args.render:
                renderthread = ppo_thread.RenderThread(sess,
                                                       trainer_monitor,
                                                       env_render,
                                                       brain_name,
                                                       args.normalize_steps,
                                                       fps)
                renderthread.start()
                render_started = True
            info = trainer.take_action(info, env, brain_name, steps, args.normalize_steps)
            trainer.process_experiences(info, args.time_horizon, args.gamma, args.lambd)
            if len(trainer.training_buffer['actions']) > args.buffer_size and args.train_model:
                if args.render:
                    renderthread.pause()
                logging.info('optimization:started')
                t = time.time()
                # perform gradient descent with experience buffer
                trainer.update_model(args.batch_size, args.num_epoch)
                logging.info('optimization:finished:duration:{:.1f} seconds'.format(float(time.time() - t)))
                if args.render:
                    renderthread.resume()
            if steps % args.summary_freq == 0 and steps != 0 and args.train_model:
                trainer.write_summary(summary_writer, steps)
            if steps % args.save_freq == 0 and steps != 0 and args.train_model:
                model_utils.save_model(sess, saver, model_path, steps)
            if args.train_model:
                steps += 1
                sess.run(ppo_model.increment_step)
                if len(trainer.stats['cumulative_reward']) > 0:
                    mean_reward = np.mean(trainer.stats['cumulative_reward'])
                    sess.run(ppo_model.update_reward, {ppo_model.new_reward: mean_reward})
                    _ = sess.run(ppo_model.last_reward)
        # final save Tensorflow model
        if steps != 0 and args.train_model:
            model_utils.save_model(sess, saver, model_path, steps)
    env.close()
    model_utils.export_graph(model_path, args.env_name)
    os.system('shutdown')
Пример #23
0
def train():
    # 加载数据集
    train_sentences = data_loader.load_sentences(FLAGS.train_file)
    dev_sentences = data_loader.load_sentences(FLAGS.dev_file)
    test_sentences = data_loader.load_sentences(FLAGS.test_file)

    # 转换编码
    data_loader.update_tag_scheme(train_sentences, FLAGS.tag_schema)
    data_loader.update_tag_scheme(dev_sentences, FLAGS.tag_schema)
    data_loader.update_tag_scheme(test_sentences, FLAGS.tag_schema)

    # 创建单词和词典映射
    if not os.path.isfile(FLAGS.map_file):
        if FLAGS.pre_emb:
            dico_words_train = data_loader.word_mapping(train_sentences)[0]
            dico_word, word_to_id, id_to_word = data_utils.augment_with_pretrained(
                dico_words_train.copy(), FLAGS.emb_file,
                list(
                    itertools.chain.from_iterable([[w[0] for w in s]
                                                   for s in test_sentences])))
        else:
            _, word_to_id, id_to_word = data_loader.word_mapping(
                train_sentences)
        _, tag_to_id, id_to_tag = data_loader.tag_mapping(train_sentences)
        with open(FLAGS.map_file, 'wb') as f:
            pickle.dump([word_to_id, id_to_word, tag_to_id, id_to_tag], f)
    else:
        with open(FLAGS.map_file, 'rb') as f:
            word_to_id, id_to_word, tag_to_id, id_to_tag = pickle.load(f)

    # 准备数据
    train_data = data_loader.prepare_dataset(train_sentences, word_to_id,
                                             tag_to_id)
    dev_data = data_loader.prepare_dataset(dev_sentences, word_to_id,
                                           tag_to_id)
    test_data = data_loader.prepare_dataset(test_sentences, word_to_id,
                                            tag_to_id)

    # 将数据分批处理
    train_manager = data_utils.BatchManager(train_data, FLAGS.batch_size)
    dev_manager = data_utils.BatchManager(dev_data, FLAGS.batch_size)
    test_manager = data_utils.BatchManager(test_data, FLAGS.batch_size)

    # 创建不存在的文件夹
    model_utils.make_path(FLAGS)

    # 判断配置文件
    if os.path.isfile(FLAGS.config_file):
        config = model_utils.load_config(FLAGS.config_file)
    else:
        config = model_utils.config_model(FLAGS, word_to_id, tag_to_id)
        model_utils.save_config(config, FLAGS.config_file)

    # 配置印logger
    log_path = os.path.join('log', FLAGS.log_file)
    logger = model_utils.get_logger(log_path)
    model_utils.print_config(config, logger)

    tf_config = tf.ConfigProto(allow_soft_placement=True)
    tf_config.gpu_options.allow_growth = True

    step_per_epoch = train_manager.len_data
    with tf.Session(config=tf_config) as sess:
        model = model_utils.create(sess, Model, FLAGS.ckpt_path, load_word2vec,
                                   config, id_to_word, logger)
        logger.info('开始训练')
        loss = []
        start = time.time()
        for i in range(100):
            for batch in train_manager.iter_batch(shuffle=True):
                step, batch_loss = model.run_step(sess, True, batch)
                loss.append(batch_loss)
                if step % FLAGS.setps_chech == 0:
                    iteration = step // step_per_epoch + 1
                    logger.info(
                        "iteration{}: step{}/{}, NER loss:{:>9.6f}".format(
                            iteration, step % step_per_epoch, step_per_epoch,
                            np.mean(loss)))
                    loss = []
            best = evaluate(sess, model, 'dev', dev_manager, id_to_tag, logger)

            if best:
                model_utils.save_model(sess, model, FLAGS.ckpt_path, logger)
            evaluate(sess, model, 'test', test_manager, id_to_tag, logger)
        t = time.time() - start
        logger.info('cost time: %f' % t)
Пример #24
0
def train(inqueues, outqueues, net, mid_net, loss_fn, opt, loaders, args,
          _logger):
    def _update_grad(net, mid_net, loss_fn, grad_list):
        if not args.fix_net:
            for name, param in net.named_parameters():
                grad_step = sum([
                    data['total'] * data['net'][name] for data in grad_list
                ]) / sum([data['total'] for data in grad_list])
                param.grad = Variable(grad_step)

            if mid_net is not None:
                for name, param in mid_net.named_parameters():
                    grad_step = sum([
                        data['total'] * data['mid_net'][name]
                        for data in grad_list
                    ]) / sum([data['total'] for data in grad_list])
                    param.grad = Variable(grad_step)

        for i in range(args.loss_step):
            for name, param in loss_fn[i].named_parameters():
                grad_step = sum([
                    data['total'] * data['loss_fn'][i][name]
                    for data in grad_list
                ]) / sum([data['total'] for data in grad_list])
                param.grad = Variable(grad_step)

            for name in loss_fn[i].buffers.keys():
                loss_fn[i].buffers[name].copy_(
                    grad_list[0]['buffer']['loss_fn'][i][name])

    def _update_correct(grad_list, corrects):
        for i in range(len(corrects)):
            corrects[i] += sum([data['correct'][i] for data in grad_list])

    def _step_stat(grad_list):
        step_sample_total = sum([data['total'] for data in grad_list])
        step_loss_total = sum([data['loss_total'] for data in grad_list])
        return step_sample_total, step_loss_total

    # Variables for training
    t = time.time()
    cur_epoch_training_total = 0
    training_total = 0
    valid_total = 0
    sample_total = 0
    loss_total = 0
    correct_total = [0] * (args.loss_step)

    recorder = None
    if args.record is not None:
        recorder = HistoryRecorder(args.record)

    epoch = 0
    epoch_end = False
    while epoch < args.epoch:
        data = {}

        if not args.fix_net or training_total == 0:
            data['fix_net'] = False
        else:
            data['fix_net'] = True

        data['args'] = args
        if not data['fix_net']:
            data['net'] = net.state_dict()
            if mid_net is not None:
                data['mid_net'] = mid_net.state_dict()

        data['loss_fn'] = []
        for loss in loss_fn:
            data['loss_fn'].append(loss.state_dict())
        data['test'] = False

        for i in range(args.worker):
            inqueues[i].send(data)

        grad_list = []
        for i in range(args.worker):
            data = outqueues[i].recv()
            grad_list.append(data)

        _update_grad(net, mid_net, loss_fn, grad_list)
        _update_correct(grad_list, correct_total)

        step_sample_total, step_loss_total = _step_stat(grad_list)

        cur_epoch_training_total += step_sample_total
        training_total += step_sample_total
        valid_total += step_sample_total
        sample_total += step_sample_total
        loss_total += step_loss_total
        opt.step()
        if (epoch + 1) * args.epoch_len <= training_total:
            _logger.info('Epoch END!!!')
            epoch_end = True

        if sample_total > args.observe or epoch_end:
            end_str = ' END!' if epoch_end else ''
            _logger.info('Epoch: %d%s Iteration: %d Loss: %.5f perTime: %.3f',
                         epoch, end_str, cur_epoch_training_total,
                         loss_total / sample_total,
                         (time.time() - t) / sample_total)
            accs = []
            for k in range(len(loss_fn)):
                accs.append('acc %d: %.5f' %
                            (k, correct_total[k] / sample_total))
            if recorder is not None:
                recorder.train_acc(training_total,
                                   correct_total[-1] / sample_total)
                recorder.save_record()
            _logger.info(' '.join(accs))
            sample_total = 0
            loss_total = 0
            correct_total = [0] * (args.loss_step)
            t = time.time()

        if valid_total > args.check_num or (epoch_end
                                            and epoch == args.epoch - 1):
            aux = {}
            aux['epoch'] = epoch
            aux['cur_iter'] = cur_epoch_training_total
            aux['total_iter'] = training_total
            save_model(
                aux, args, net, mid_net, loss_fn,
                args.output + '_%d_%d' % (epoch, cur_epoch_training_total))
            _logger.warning(
                'Model saved to %s',
                args.output + '_%d_%d' % (epoch, cur_epoch_training_total))
            _logger.warning('Start validation!')
            valid_start = time.time()
            data = {}
            data['fix_net'] = False
            data['args'] = args
            data['net'] = net.state_dict()
            if mid_net is not None:
                data['mid_net'] = mid_net.state_dict()
            data['loss_fn'] = []
            for loss in loss_fn:
                data['loss_fn'].append(loss.state_dict())
            data['test'] = True

            for i in range(args.worker):
                inqueues[i].send(data)

            result_correct = 0
            result_total = 0

            for i in range(args.worker):
                data = outqueues[i].recv()
                result_correct += data['correct']
                result_total += data['total']
            result_ = result_correct / result_total
            _logger.warning(
                'Validation complete! Time lapse: %.3f, Test acc: %.5f' %
                (time.time() - valid_start, result_))

            if recorder is not None:
                recorder.test_acc(training_total, result_)
                recorder.save_record()
            valid_total = 0
            if args.fix_net:
                _logger.warning('learning rate decreases from %.6f to %.6f',
                                args.learning_rate, args.learning_rate / 3)
                args.learning_rate /= 2
                opt = get_opt(net, mid_net, loss_fn, args)

        if args.unfix_net_after is not None and training_total > args.unfix_net_after:
            args.fix_net = False

        if epoch_end and args.learning_rate > args.min_lr:
            _logger.warning('learning rate decreases from %.6f to %.6f',
                            args.learning_rate, args.learning_rate / 3)
            args.learning_rate /= 3
            opt = get_opt(net, mid_net, loss_fn, args)

        if epoch_end:
            cur_epoch_training_total = 0
            epoch_end = False
            epoch += 1
Пример #25
0
def train(train_features_tensor_dataset,
          dev_features_tensor_dataset,
          test_features_tensor_dataset=None,
          data_mode='mongo',
          demo=False,
          use_w2v=False):
    device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
    args.n_gpu = torch.cuda.device_count()
    args.batch_size = int(args.batch_size)

    if 'set random seed':
        seed_everything(args.seed)
        if args.n_gpu > 0:
            torch.cuda.manual_seed_all(args.seed)

    if not os.path.exists(args.output_dir):
        os.makedirs(args.output_dir)

    logger.info("train examples {}".format(len(train_features_tensor_dataset)))
    num_train_steps = int(
        len(train_features_tensor_dataset) / args.batch_size *
        args.num_train_epochs)
    steps_a_epoch = int(num_train_steps // args.num_train_epochs)

    if 'create train TensorDataset':
        train_sampler = RandomSampler(train_features_tensor_dataset)
        train_dataloader = DataLoader(train_features_tensor_dataset,
                                      sampler=train_sampler,
                                      batch_size=args.batch_size,
                                      drop_last=True)

    if 'create dev TensorDataset':
        dev_sampler = SequentialSampler(dev_features_tensor_dataset)
        dev_dataloader = DataLoader(dev_features_tensor_dataset,
                                    sampler=dev_sampler,
                                    batch_size=args.batch_size,
                                    drop_last=False)

    if 'create test TensorDataset':
        test_sampler = SequentialSampler(test_features_tensor_dataset)
        test_dataloader = DataLoader(test_features_tensor_dataset,
                                     sampler=test_sampler,
                                     batch_size=args.batch_size,
                                     drop_last=False)

    log = Log(args, running_time, baseline, benchmark)
    if 'create model':
        bert_config = BertConfig.from_json_file(args.bert_config_file)
        weight = ''
        if use_w2v:
            weight = load_pkl_data(args.w2v_weight)
        if baseline == 'baseline1':
            model = Baseline1(args, use_w2v=use_w2v, weight=weight)
        elif baseline == 'baseline2':
            model = Baseline2(args, use_w2v=use_w2v, weight=weight)
        elif baseline == 'baseline3':
            model = Baseline3(args, use_w2v=use_w2v, weight=weight)
        elif baseline == 'baseline4':
            model = Baseline4(args, use_w2v=use_w2v, weight=weight)
        elif baseline == 'baseline5':
            model = Baseline5(args, use_w2v=use_w2v, weight=weight)
        elif baseline == 'baseline6':
            model = Baseline6(args, use_w2v=use_w2v, weight=weight)
        elif baseline == 'MSCNN':
            model = MSCNN(args, use_w2v=use_w2v, weight=weight)
        elif baseline == 'MSAIN':
            model = MSAIN(args, use_w2v=use_w2v, weight=weight)
        elif baseline == 'MLCCNN':
            model = MLCCNN(args, use_w2v=use_w2v, weight=weight)
        else:
            raise Exception('model not exsit')

        model.to(device)

        # Prepare optimizer
        param_optimizer = list(model.named_parameters())
        optimizer_grouped_parameters = [{
            'params': [p for n, p in param_optimizer],
            'weight_decay':
            0.0
        }]
        optimizer = torch.optim.Adagrad(optimizer_grouped_parameters,
                                        lr=args.learning_rate)

        # DataParallel training
        if args.n_gpu > 1:
            model = torch.nn.DataParallel(model)

    global_step = 0
    best_top1 = 0
    for curEpoch in range(int(args.num_train_epochs)):
        model.train()
        with tqdm(total=steps_a_epoch) as pbar:
            for step, batch in enumerate(train_dataloader):
                if data_mode == 'mongo':
                    indexes = batch[0].sort().values.tolist()
                    batch_data = [
                        item for item in collection.find(
                            {'index': {
                                '$in': indexes
                            }})
                    ]
                    if use_w2v:
                        q_input_ids_w2v = torch.tensor(
                            [item['q_w2v_ids'] for item in batch_data],
                            dtype=torch.long).to(device)
                        p_a_input_ids_w2v = torch.tensor(
                            [item['p_a_w2v_ids'] for item in batch_data],
                            dtype=torch.long).to(device)
                        n_a_input_ids_w2v = torch.tensor(
                            [item['n_a_w2v_ids'] for item in batch_data],
                            dtype=torch.long).to(device)
                        q_input_mask_tensor = torch.tensor(
                            [item['q_input_mask'] for item in batch_data],
                            dtype=torch.uint8).to(device)
                        p_a_input_mask_tensor = torch.tensor(
                            [item['p_a_input_mask'] for item in batch_data],
                            dtype=torch.uint8).to(device)
                        n_a_input_mask_tensor = torch.tensor(
                            [item['n_a_input_mask'] for item in batch_data],
                            dtype=torch.uint8).to(device)
                    else:
                        q_input_ids_tensor = torch.tensor(
                            [item['q_input_ids'] for item in batch_data],
                            dtype=torch.long).to(device)
                        q_input_mask_tensor = torch.tensor(
                            [item['q_input_mask'] for item in batch_data],
                            dtype=torch.long).to(device)
                        q_segment_ids_tensor = torch.tensor(
                            [item['q_segment_ids'] for item in batch_data],
                            dtype=torch.long).to(device)
                        p_a_input_ids_tensor = torch.tensor(
                            [item['p_a_input_ids'] for item in batch_data],
                            dtype=torch.long).to(device)
                        p_a_input_mask_tensor = torch.tensor(
                            [item['p_a_input_mask'] for item in batch_data],
                            dtype=torch.long).to(device)
                        p_a_segment_ids_tensor = torch.tensor(
                            [item['p_a_segment_ids'] for item in batch_data],
                            dtype=torch.long).to(device)
                        n_a_input_ids_tensor = torch.tensor(
                            [item['n_a_input_ids'] for item in batch_data],
                            dtype=torch.long).to(device)
                        n_a_input_mask_tensor = torch.tensor(
                            [item['n_a_input_mask'] for item in batch_data],
                            dtype=torch.long).to(device)
                        n_a_segment_ids_tensor = torch.tensor(
                            [item['n_a_segment_ids'] for item in batch_data],
                            dtype=torch.long).to(device)
                elif data_mode == 'local':
                    batch = tuple(input.to(device) for input in batch)
                    question_id, pos_ans_id, neg_ans_id, \
                    q_input_ids, q_input_mask, q_segment_ids, \
                    p_a_input_ids, p_a_input_mask, p_a_segment_ids, \
                    n_a_input_ids, n_a_input_mask, n_a_segment_ids = batch

                if use_w2v:
                    loss, pre_pos_sim = model(
                        q_input_ids_w2v=q_input_ids_w2v,
                        p_a_input_ids_w2v=p_a_input_ids_w2v,
                        n_a_input_ids_w2v=n_a_input_ids_w2v,
                        q_input_mask=q_input_mask_tensor,
                        p_a_input_mask=p_a_input_mask_tensor,
                        n_a_input_mask=n_a_input_mask_tensor,
                    )
                else:
                    loss, pre_pos_sim = model(
                        q_input_ids=q_input_ids_tensor,
                        q_input_mask=q_input_mask_tensor,
                        q_segment_ids=q_segment_ids_tensor,
                        p_a_input_ids=p_a_input_ids_tensor,
                        p_a_input_mask=p_a_input_mask_tensor,
                        p_a_segment_ids=p_a_segment_ids_tensor,
                        n_a_input_ids=n_a_input_ids_tensor,
                        n_a_input_mask=n_a_input_mask_tensor,
                        n_a_segment_ids=n_a_segment_ids_tensor)
                if args.n_gpu > 1:
                    loss = loss.mean()
                loss.backward()
                if 'clip grad norm':
                    torch.nn.utils.clip_grad_norm_(model.parameters(),
                                                   args.max_grad_norm)
                #lr_scheduler.step()   # initial_lr = 0
                optimizer.step()
                optimizer.zero_grad()

                pbar.set_description(
                    f'{baseline}, benchmark-{benchmark}, train loss: {loss:.6f}'
                )
                log.print(
                    f'{baseline}, benchmark-{benchmark}, step: {global_step}, train loss: {loss:.6f}'
                )
                pbar.update(1)
                global_step += 1

                if step % args.dev_step == 0 and step != 0:
                    top1 = dev(args,
                               model,
                               dev_dataloader,
                               device,
                               demo=False,
                               use_w2v=use_w2v)
                    if top1 > best_top1:
                        best_top1 = top1
                        logging.info(
                            f'{baseline}, benchmark-{benchmark}, epoch:{curEpoch}, global_step:{global_step}, dev top1:{top1:.2%}, best top1: {best_top1:.2%}'
                        )
                        log.print(
                            f'{baseline}, benchmark-{benchmark}, epoch:{curEpoch}, global_step:{global_step}, dev top1:{top1:.2%}, best top1: {best_top1:.2%}'
                        )

                        save_model(model, global_step, args, logging, log,
                                   running_time, benchmark, baseline)
                    else:
                        logging.info(
                            f'{baseline}, benchmark-{benchmark}, epoch:{curEpoch}, global_step:{global_step}, dev top1:{top1:.2%}, best top1: {best_top1:.2%}'
                        )
                        log.print(
                            f'{baseline}, benchmark-{benchmark}, epoch:{curEpoch}, global_step:{global_step}, dev top1:{top1:.2%}, best top1: {best_top1:.2%}'
                        )

                    model.train()

        top1 = dev(args,
                   model,
                   dev_dataloader,
                   device,
                   demo=False,
                   use_w2v=use_w2v)
        if top1 > best_top1:
            best_top1 = top1
            save_model(model, global_step, args, logging, log, running_time,
                       benchmark, baseline)
        logging.info(
            f'{baseline}, benchmark-{benchmark}, epoch:{curEpoch}, global_step:{global_step}, dev top1:{top1:.2%}, best top1: {best_top1:.2%}'
        )
        log.print(
            f'{baseline}, benchmark-{benchmark}, epoch:{curEpoch}, global_step:{global_step}, dev top1:{top1:.2%}, best top1: {best_top1:.2%}'
        )

    test_top1 = test(args,
                     model,
                     test_dataloader,
                     device,
                     running_time,
                     baseline,
                     benchmark,
                     demo=False,
                     use_w2v=use_w2v)
    logging.info(
        f'{baseline}, benchmark-{benchmark}, best test top1:{test_top1:.2%}')
    log.print(
        f'{baseline}, benchmark-{benchmark}, best test top1:{test_top1:.2%}')
Пример #26
0
def train_model(
    train_graph: pyg.torch_geometric.data.Data,
    valid_graph: pyg.torch_geometric.data.Data,
    train_dl: data.DataLoader,
    dev_dl: data.DataLoader,
    evaluator: Evaluator,
    model: nn.Module,
    optimizer: optim.Optimizer,
    lr_scheduler: optim.lr_scheduler._LRScheduler,
    args: argparse.Namespace,
) -> nn.Module:

    device = model_utils.get_device()
    loss_fn = nn.functional.binary_cross_entropy
    val_loss_fn = nn.functional.binary_cross_entropy
    best_val_loss = torch.tensor(float('inf'))
    best_val_hits = torch.tensor(0.0)
    saved_checkpoints = []
    writer = SummaryWriter(log_dir=f'{args.log_dir}/{args.experiment}')

    for e in range(1, args.train_epochs + 1):
        print(f'Training epoch {e}...')

        # Training portion
        torch.cuda.empty_cache()
        torch.set_grad_enabled(True)
        with tqdm(total=args.train_batch_size * len(train_dl)) as progress_bar:
            model.train()

            # Load graph into GPU
            adj_t = train_graph.adj_t.to(device)
            edge_index = train_graph.edge_index.to(device)
            x = train_graph.x.to(device)

            pos_pred = []
            neg_pred = []

            for i, (y_pos_edges,) in enumerate(train_dl):
                y_pos_edges = y_pos_edges.to(device).T
                y_neg_edges = negative_sampling(
                    edge_index,
                    num_nodes=train_graph.num_nodes,
                    num_neg_samples=y_pos_edges.shape[1]
                ).to(device)
                y_batch = torch.cat([torch.ones(y_pos_edges.shape[1]), torch.zeros(
                    y_neg_edges.shape[1])], dim=0).to(device)  # Ground truth edge labels (1 or 0)

                # Forward pass on model
                optimizer.zero_grad()
                y_pred = model(adj_t, torch.cat(
                    [y_pos_edges, y_neg_edges], dim=1))
                loss = loss_fn(y_pred, y_batch)

                # Backward pass and optimization
                loss.backward()
                optimizer.step()
                if args.use_scheduler:
                    lr_scheduler.step(loss)

                batch_acc = torch.mean(
                    1 - torch.abs(y_batch.detach() - torch.round(y_pred.detach()))).item()

                pos_pred += [y_pred[y_batch == 1].detach()]
                neg_pred += [y_pred[y_batch == 0].detach()]

                progress_bar.update(y_pos_edges.shape[1])
                progress_bar.set_postfix(loss=loss.item(), acc=batch_acc)
                writer.add_scalar(
                    "train/Loss", loss, ((e - 1) * len(train_dl) + i) * args.train_batch_size)
                writer.add_scalar("train/Accuracy", batch_acc,
                                  ((e - 1) * len(train_dl) + i) * args.train_batch_size)

                del y_pos_edges
                del y_neg_edges
                del y_pred
                del loss

            del adj_t
            del edge_index
            del x

            # Training set evaluation Hits@K Metrics
            pos_pred = torch.cat(pos_pred, dim=0)
            neg_pred = torch.cat(neg_pred, dim=0)
            results = {}
            for K in [10, 20, 30]:
                evaluator.K = K
                hits = evaluator.eval({
                    'y_pred_pos': pos_pred,
                    'y_pred_neg': neg_pred,
                })[f'hits@{K}']
                results[f'Hits@{K}'] = hits
            print()
            print(f'Train Statistics')
            print('*' * 30)
            for k, v in results.items():
                print(f'{k}: {v}')
                writer.add_scalar(
                    f"train/{k}", v, (pos_pred.shape[0] + neg_pred.shape[0]) * e)
            print('*' * 30)

            del pos_pred
            del neg_pred

        # Validation portion
        torch.cuda.empty_cache()
        torch.set_grad_enabled(False)
        with tqdm(total=args.val_batch_size * len(dev_dl)) as progress_bar:
            model.eval()

            adj_t = valid_graph.adj_t.to(device)
            edge_index = valid_graph.edge_index.to(device)
            x = valid_graph.x.to(device)

            val_loss = 0.0
            accuracy = 0
            num_samples_processed = 0
            pos_pred = []
            neg_pred = []
            for i, (edges_batch, y_batch) in enumerate(dev_dl):
                edges_batch = edges_batch.T.to(device)
                y_batch = y_batch.to(device)

                # Forward pass on model in validation environment
                y_pred = model(adj_t, edges_batch)
                loss = val_loss_fn(y_pred, y_batch)

                num_samples_processed += edges_batch.shape[1]
                batch_acc = torch.mean(
                    1 - torch.abs(y_batch - torch.round(y_pred))).item()
                accuracy += batch_acc * edges_batch.shape[1]
                val_loss += loss.item() * edges_batch.shape[1]

                pos_pred += [y_pred[y_batch == 1].detach()]
                neg_pred += [y_pred[y_batch == 0].detach()]

                progress_bar.update(edges_batch.shape[1])
                progress_bar.set_postfix(
                    val_loss=val_loss / num_samples_processed,
                    acc=accuracy/num_samples_processed)
                writer.add_scalar(
                    "Val/Loss", loss, ((e - 1) * len(dev_dl) + i) * args.val_batch_size)
                writer.add_scalar(
                    "Val/Accuracy", batch_acc, ((e - 1) * len(dev_dl) + i) * args.val_batch_size)

                del edges_batch
                del y_batch
                del y_pred
                del loss

            del adj_t
            del edge_index
            del x

            # Validation evaluation Hits@K Metrics
            pos_pred = torch.cat(pos_pred, dim=0)
            neg_pred = torch.cat(neg_pred, dim=0)
            results = {}
            for K in [10, 20, 30]:
                evaluator.K = K
                hits = evaluator.eval({
                    'y_pred_pos': pos_pred,
                    'y_pred_neg': neg_pred,
                })[f'hits@{K}']
                results[f'Hits@{K}'] = hits
            print()
            print(f'Validation Statistics')
            print('*' * 30)
            for k, v in results.items():
                print(f'{k}: {v}')
                writer.add_scalar(
                    f"Val/{k}", v, (pos_pred.shape[0] + neg_pred.shape[0]) * e)
            print('*' * 30)

            del pos_pred
            del neg_pred

            # Save model if it's the best one yet.
            if results['Hits@20'] > best_val_hits:
                best_val_hits = results['Hits@20']
                filename = f'{args.save_path}/{args.experiment}/{model.__class__.__name__}_best_val.checkpoint'
                model_utils.save_model(model, filename)
                print(f'Model saved!')
                print(f'Best validation Hits@20 yet: {best_val_hits}')
            # Save model on checkpoints.
            if e % args.checkpoint_freq == 0:
                filename = f'{args.save_path}/{args.experiment}/{model.__class__.__name__}_epoch_{e}.checkpoint'
                model_utils.save_model(model, filename)
                print(f'Model checkpoint reached!')
                saved_checkpoints.append(filename)
                # Delete checkpoints if there are too many
                while len(saved_checkpoints) > args.num_checkpoints:
                    os.remove(saved_checkpoints.pop(0))

    return model
Пример #27
0
def main():
    parser = argparse.ArgumentParser()
    add_train_args(parser)
    add_common_args(parser)
    args = parser.parse_args()
    add_experiment(args)
    device = model_utils.get_device()

    # Load dataset from disk
    print('Loading train data...')
    train_graph, valid_graph, train_edges, eval_edges, valid_edges = model_utils.load_training_data()
    if args.train_partial_graph:
        train_edges['edge'] = eval_edges['edge']

    train_dl = data.DataLoader(
        data.TensorDataset(train_edges['edge']),
        batch_size=args.train_batch_size,
        shuffle=True,
    )
    dev_dl = data.DataLoader(
        data.TensorDataset(
            torch.cat([valid_edges['edge'], valid_edges['edge_neg']], dim=0),
            torch.cat([torch.ones(valid_edges['edge'].shape[0]),
                       torch.zeros(valid_edges['edge_neg'].shape[0])], dim=0),
        ),
        batch_size=args.val_batch_size,
        shuffle=True,
    )

    # Initialize node embeddings
    print('Computing initial embeddings')
    train_graph = model_utils.initialize_embeddings(
        train_graph, 'train_embeddings.pt', args.refresh_embeddings)
    valid_graph = model_utils.initialize_embeddings(
        valid_graph, 'valid_embeddings.pt', args.refresh_embeddings)
    if not args.train_partial_graph:
        train_graph = valid_graph

    # Stats evaluator
    evaluator = Evaluator(name='ogbl-ddi')

    # Initialize a model
    model = models.get_model(args.model)(
        # train_graph.x.shape, train_graph.adj_t.to(device)
        num_nodes=train_graph.num_nodes, adj_t=train_graph.adj_t.to(device)
    )

    # load from checkpoint if path specified
    if args.load_path is not None:
        model = model_utils.load_model(model, args.load_path)
    print(f"Parameters: {model_utils.count_parameters(model)}")

    # Move model to GPU if necessary
    model.to(device)

    # Initialize optimizer
    optimizer = optim.Adam(
        model.parameters(),
        lr=args.learning_rate,
        weight_decay=args.weight_decay,
    )

    # Scheduler
    scheduler = optim.lr_scheduler.ReduceLROnPlateau(
        optimizer,
        mode='min',
        factor=0.5,
        patience=30,
        verbose=True,
    )

    os.makedirs(f'{args.save_path}/{args.experiment}')
    print(f'Created new experiment: {args.experiment}')
    save_arguments(args, f'{args.save_path}/{args.experiment}/args.txt')

    # Train!
    trained_model = train_model(
        train_graph,
        valid_graph,
        train_dl,
        dev_dl,
        evaluator,
        model,
        optimizer,
        scheduler,
        args,
    )

    # Save trained model
    filename = f'{args.save_path}/{args.experiment}/{model.__class__.__name__}_trained.checkpoint'
    model_utils.save_model(trained_model, filename)
Пример #28
0
                        bias_initializer='random_normal'))
model.add(
    keras.layers.Dense(8,
                       activation='sigmoid',
                       kernel_initializer=tf.keras.initializers.Orthogonal(),
                       bias_initializer='random_normal'))
model.add(
    keras.layers.Dense(1,
                       kernel_initializer='orthogonal',
                       bias_initializer='random_normal'))

# construct signals
N = 100
x = 10 * np.sin(np.arange(N) * np.pi * 0.1)
y = model.predict((x.reshape((1, -1, 1))))
print(y.shape)
y = y.flatten()

# plot signals
plt.figure()
plt.plot(x)
plt.plot(y, '--')
plt.ylim(-0.5, 0.5)
plt.savefig('python/conv.png')

# save signals
np.savetxt('test_data/conv_x_python.csv', x, delimiter=',')
np.savetxt('test_data/conv_y_python.csv', y, delimiter=',')

save_model(model, 'models/conv.json')
Пример #29
0
	def save(self):
		return save_model('model', self)
Пример #30
0
def train():
    # 加载数据集
    train_sentences = data_loader.load_sentences(FLAGS.train_file)
    dev_sentences = data_loader.load_sentences(FLAGS.dev_file)
    test_sentences = data_loader.load_sentences(FLAGS.test_file)

    # 转换编码 bio转bioes
    data_loader.update_tag_scheme(train_sentences, FLAGS.tag_schema)
    data_loader.update_tag_scheme(test_sentences, FLAGS.tag_schema)
    data_loader.update_tag_scheme(dev_sentences, FLAGS.tag_schema)

    # 创建单词映射及标签映射
    if not os.path.isfile(FLAGS.map_file):
        if FLAGS.pre_emb:
            dico_words_train = data_loader.word_mapping(train_sentences)[0]
            dico_word, word_to_id, id_to_word = data_utils.augment_with_pretrained(
                dico_words_train.copy(),
                FLAGS.emb_file,
                list(
                    itertools.chain.from_iterable(
                        [[w[0] for w in s] for s in test_sentences]
                    )
                )
            )
        else:
            _, word_to_id, id_to_word = data_loader.word_mapping(train_sentences)

        _, tag_to_id, id_to_tag = data_loader.tag_mapping(train_sentences)

        with open(FLAGS.map_file, "wb") as f:
            pickle.dump([word_to_id, id_to_word, tag_to_id, id_to_tag], f)
    else:
        with open(FLAGS.map_file, 'rb') as f:
            word_to_id, id_to_word, tag_to_id, id_to_tag = pickle.load(f)

    train_data = data_loader.prepare_dataset(
        train_sentences, word_to_id, tag_to_id
    )

    dev_data = data_loader.prepare_dataset(
        dev_sentences, word_to_id, tag_to_id
    )

    test_data = data_loader.prepare_dataset(
        test_sentences, word_to_id, tag_to_id
    )

    train_manager = data_utils.BatchManager(train_data, FLAGS.batch_size)
    dev_manager = data_utils.BatchManager(dev_data, FLAGS.batch_size)
    test_manager = data_utils.BatchManager(test_data, FLAGS.batch_size)

    print('train_data_num %i, dev_data_num %i, test_data_num %i' % (len(train_data), len(dev_data), len(test_data)))

    model_utils.make_path(FLAGS)

    if os.path.isfile(FLAGS.config_file):
        config = model_utils.load_config(FLAGS.config_file)
    else:
        config = model_utils.config_model(FLAGS, word_to_id, tag_to_id)
        model_utils.save_config(config, FLAGS.config_file)

    log_path = os.path.join("log", FLAGS.log_file)
    logger = model_utils.get_logger(log_path)
    model_utils.print_config(config, logger)

    tf_config = tf.ConfigProto()
    tf_config.gpu_options.allow_growth = True
    steps_per_epoch =train_manager.len_data
    with tf.Session(config = tf_config) as sess:
        model = model_utils.create(sess, Model, FLAGS.ckpt_path, load_word2vec, config, id_to_word, logger)
        logger.info("开始训练")
        loss = []
        for i in range(100):
            for batch in train_manager.iter_batch(shuffle=True):
                step, batch_loss = model.run_step(sess, True, batch)
                loss.append(batch_loss)
                if step % FLAGS.setps_chech== 0:
                    iterstion = step // steps_per_epoch + 1
                    logger.info("iteration:{} step{}/{},NER loss:{:>9.6f}".format(iterstion, step%steps_per_epoch, steps_per_epoch, np.mean(loss)))
                    loss = []

            best = evaluate(sess,model,"dev", dev_manager, id_to_tag, logger)

            if best:
                model_utils.save_model(sess, model, FLAGS.ckpt_path, logger)
            evaluate(sess, model, "test", test_manager, id_to_tag, logger)
Пример #31
0
def main():

    midi_dir = '../../../data/query_symlinks'

    model_num = 3
    model_dir = '../../../models/keras/02_event_rnn/{}'.format(model_num)
    rythm_test = False

    window_size = 20

    # only creates if doesn't already exist
    model_utils.create_model_dir(model_dir)

    files = [os.path.join(midi_dir, path) for path in os.listdir(midi_dir)]
    train_files = files[0:1000]
    val_files   = files[1000:1250]

    # get the train/val d 
    train_generator = data_utils.get_data_generator(train_files, 
                                                    form=data_utils.F_EVENT_WINDOW_TIMES, 
                                                    window_size=20)

    val_generator = data_utils.get_data_generator(val_files,
                                                  form=data_utils.F_EVENT_WINDOW_TIMES, 
                                                  window_size=20)

    # train_generator = scale_data(train_generator)
    # val_generator = scale_data(val_generator)

    X_timing_seed, _ = val_generator.next()
    # pdb.set_trace()

    timing_model, epoch = get_timing_model(model_dir,
                                           window_size=window_size, 
                                           model_index=1)

    note_model, _ = get_note_model(model_dir,
                                   window_size=window_size, 
                                   model_index=0)

    model_utils.save_model(note_model, model_dir, model_index=0)
    model_utils.save_model(timing_model, model_dir, model_index=1)
    
    callbacks = model_utils.get_callbacks(model_dir, 
                                          checkpoint_monitor='val_mae',
                                          model_index=1)
    
    # print('fitting timing model...')
    # timing_model.fit_generator(train_generator,
    #                            steps_per_epoch=data_utils.WINDOWS_PER_FILE * len(train_files), 
    #                            epochs=30,
    #                            validation_data=val_generator, 
    #                            validation_steps=data_utils.WINDOWS_PER_FILE * len(val_files),
    #                            verbose=1, 
    #                            callbacks=callbacks,
    #                            initial_epoch=epoch)

    train_generator = data_utils.get_data_generator(train_files, 
                                                    form=data_utils.F_EVENT_WINDOW_NOTES, 
                                                    window_size=20)


    callbacks = model_utils.get_callbacks(model_dir, 
                                          checkpoint_monitor='val_mae',
                                          model_index=0)

    val_generator = data_utils.get_data_generator(val_files,
                                                  form=data_utils.F_EVENT_WINDOW_NOTES, 
                                                  window_size=20)

    # print('fitting note model...')
    # note_model.fit_generator(train_generator,
    #                          steps_per_epoch=data_utils.WINDOWS_PER_FILE * 10, 
    #                          epochs=10,
    #                          validation_data=val_generator, 
    #                          validation_steps=data_utils.WINDOWS_PER_FILE * 2,
    #                          verbose=1, 
    #                          callbacks=callbacks,
    #                          initial_epoch=epoch)


    # generate 10 tracks using random seeds
    X_note_seed, _ = val_generator.next()

    print('generating notes...')
    generated_notes = model_utils.generate_notes(note_model, X_note_seed)
    
    print('generating timings...')
    # replace start/end note events with values generated from timing models
    generated_timings = model_utils.generate_timings(timing_model, X_timing_seed)

    for i, midi in enumerate(generated_notes):
        for instrument in midi.instruments:
            wall_time = 0
            if rythm_test:
                instrument.program = 125 
            for j, note in enumerate(instrument.notes):
                if rythm_test:
                    note.pitch = 60
                offset = generated_timings[i][j][0]
                duration = generated_timings[i][j][1]
                note.start = wall_time + offset
                note.end   = wall_time + offset + duration
                wall_time = wall_time + offset + duration

    for i, midi in enumerate(generated_notes):
        file = os.path.join(model_dir, 'generated', '{}.mid'.format(i + 1))
        midi.write(file.format(i + 1))
        print('wrote midi file to {}'.format(file))