Пример #1
0
def train_classifier(train_set, dev_set, num_iterations, learning_rate, model,
                     regularization, model_file):
    best_dev_accuracy = 0.0
    for epoch in xrange(num_iterations):
        np.random.shuffle(train_set)
        print '\nbegan doing epoch no.', epoch + 1
        total_loss = 0.0  # total loss in this iteration.
        avg_loss = 0.0
        count = 0.0
        batch_size = 10
        start_time = time.time()
        for batch_index in range(0, len(train_set), batch_size):
            loss = model.train_on_mini_batch(
                train_set[batch_index:batch_index + batch_size, :-1],
                train_set[batch_index:batch_index + batch_size,
                          -1].astype(dtype=int), learning_rate, regularization)
            total_loss += loss
            avg_loss += loss
            count += batch_size
            if count % 5000 == 0:
                took = time.time() - start_time
                start_time = time.time()
                print '\t', (count / len(train_set)) * 100, '% complete.', 'took:', took,\
                    'seconds. average loss <-', avg_loss / 5000
                avg_loss = 0
        train_loss = total_loss / len(train_set)
        train_accuracy = accuracy_on_dataset(train_set, model)
        dev_accuracy = accuracy_on_dataset(dev_set, model)
        print 'epoch:', epoch + 1, 'loss:', train_loss, 'train accuracy:', train_accuracy, 'dev accuracy:', dev_accuracy
        if dev_accuracy > best_dev_accuracy:
            best_dev_accuracy = dev_accuracy
            print 'saving model....'
            save_model(model, model_file)
Пример #2
0
def train_classifier(train_set, dev_set, num_iterations, learning_rate, model,
                     regularization, model_file):
    best_dev_accuracy = 0.0
    for epoch in xrange(num_iterations):
        np.random.shuffle(train_set)
        print '\nbegan doing epoch no.', epoch + 1
        total_loss = 0.0  # total loss in this iteration.
        avg_loss = 0.0
        count = 0.0
        start_time = time.time()
        for example in train_set:
            loss = model.train_on_example(example[:-1], example[-1],
                                          learning_rate, regularization)
            total_loss += loss
            avg_loss += loss
            count += 1
            if count % 5000 == 0:
                took = time.time() - start_time
                start_time = time.time()
                print '\t', (count / len(train_set)) * 100, '% complete.', 'took:', took,\
                    'seconds. average loss <-', avg_loss / 5000
                model.add_loss_data(avg_loss)
                avg_loss = 0
        train_loss = total_loss / len(train_set)
        train_accuracy = accuracy_on_dataset(train_set, model)
        dev_accuracy = accuracy_on_dataset(dev_set, model)
        print 'epoch:', epoch + 1, 'loss:', train_loss, 'train accuracy:', train_accuracy, 'dev accuracy:', dev_accuracy
        if dev_accuracy > best_dev_accuracy:
            best_dev_accuracy = dev_accuracy
            print 'saving model....'
            save_model(model, model_file)
def main():
    if len(sys.argv) == 3:
        database_filepath, model_filepath = sys.argv[1:]
        print('Loading data...\n    DATABASE: {}'.format(database_filepath))
        X, Y, category_names = load_data(database_filepath)
        X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.2)

        print('Building model...')
        model = build_model()

        print('Training model...')
        model.fit(X_train, Y_train)

        print('Evaluating model...')
        evaluate_model(model, X_test, Y_test, category_names)

        print('Saving model...\n    MODEL: {}'.format(model_filepath))
        save_model(model, model_filepath)

        print('Trained model saved!')

    else:
        print('Please provide the filepath of the disaster messages database '\
              'as the first argument and the filepath of the pickle file to '\
              'save the model to as the second argument. \n\nExample: python '\
              'train_classifier.py ../data/DisasterResponse.db classifier.pkl')
Пример #4
0
def train_classifier(train_set, dev_set, num_iterations, models, roulette):
    length = len(train_set)
    population_size = len(models)
    blank_models = []
    for b in range(population_size - 4):
        blank = ga_mdl.Genetic_NNModel([28 * 28, 128, 10])
        blank_models.append(blank)

    batch_size = 200
    population = models
    best = None
    for epoch in range(num_iterations):
        np.random.shuffle(train_set)
        avg_loss = 0
        print '\nbegan doing epoch no.', epoch + 1
        s_time = time.time()
        for batch_index in range(0, length, batch_size):
            losses = []
            batch = train_set[batch_index:batch_index + batch_size]

            # s_t = time.time()
            calc_loss(population, batch)
            # print time.time() - s_t
            for model in population:
                losses.append([model.batch_loss, model])
            losses = sorted(losses)
            avg_loss += losses[0][0]
            if batch_index % 1000 == 0 and batch_index != 0:
                e_time = time.time()
                print '\t', batch_index / float(length), '% complete. took:', e_time - s_time,\
                    'average loss <-', avg_loss / 1000
                avg_loss = 0
                s_time = time.time()
            if batch_index % 5000 == 0:
                print '\taccuracy on dev: best:', accuracy_on_dataset(dev_set, losses[0][1]),\
                    'loss of best:', '%.2f' % (losses[0][0] / batch_size), \
                    '\n\taccuracy on dev: worst:', accuracy_on_dataset(dev_set, losses[-1][1]), \
                    'loss of worst:', '%.2f' % (losses[-1][0] / batch_size)
            new_population = []
            best = losses[0][1]
            new_population.append(losses[0][1])
            new_population.append(losses[1][1])
            new_population.append(losses[2][1])
            new_population.append(losses[3][1])
            crossovers(losses, roulette, new_population, blank_models,
                       population_size - 4)
            blank_models = []
            for j in range(2, population_size, 1):
                blank_models.append(losses[j][1])
            population = new_population
        train_accuracy = accuracy_on_dataset(train_set, best)
        dev_accuracy = accuracy_on_dataset(dev_set, best)
        print '****** EPOCH SUMMARY', epoch + 1, train_accuracy, dev_accuracy
        print '****** saving population...'
        count = 0
        for m in population:
            save_model(m,
                       '../saved_models/ga200_p2after_m' + str(count) + '.mdl')
            count += 1
Пример #5
0
def train(model, epochs, train_dl, val_dl, fold):
    best_score = 0.0
    lr0 = args.init_lr_0
    iterations = epochs * len(train_dl)
    idx = 0
    # create optimizer with differential learning rates
    optimizer = create_optimizer(MODEL, BASE_OPTIMIZER, args.init_lr_0,
                                 DIFF_LR_FACTORS)
    # set up lr schedule based on val loss
    lr_scheduler = optim.lr_scheduler.ReduceLROnPlateau(optimizer,
                                                        'min',
                                                        verbose=True,
                                                        patience=args.patience)
    for epoch in range(epochs):
        total_loss = 0
        # training loop
        model.train()
        for batch_idx, (data, target) in enumerate(train_dl):
            data, target = data.cuda().float(), target.cuda().float()
            output = model(data)
            loss = F.binary_cross_entropy_with_logits(output, target)
            total_loss += loss.item()
            optimizer.zero_grad()
            loss.backward()
            optimizer.step()
            idx += 1
            # unfreeze deeper layers sequentially
            if idx == int(0.1 * iterations):
                model.unfreeze(1)
                logger.info("Iteration %d: Unfreezing group 1" % idx)
            if idx == int(0.2 * iterations):
                model.unfreeze(0)
                logger.info("Iteration %d: Unfreezing group 0" % idx)
            if batch_idx % 100 == 0:
                logger.info("Epoch %d (Batch %d / %d)\t Train loss: %.3f" % \
                    (epoch+1, batch_idx, len(train_dl), loss.item()))
        # train loss
        train_loss = total_loss / len(train_dl)
        logger.info("Epoch %d\t Train loss: %.3f" % (epoch + 1, train_loss))
        mlflow.log_metric('train_loss', train_loss, step=epoch)
        # validation scores
        val_f2_score, val_loss = validate(model, val_dl, 0.2)
        # lr monitoring val_loss
        lr_scheduler.step(val_loss)
        logger.info("Epoch %d \t Validation loss: %.3f, F2 score: %.3f" % \
            (epoch+1, val_loss, val_f2_score))
        mlflow.log_metric('val_loss', val_loss, step=epoch)
        mlflow.log_metric('val_f2_score', val_f2_score, step=epoch)
        # model saving
        if val_f2_score > best_score:
            best_score = val_f2_score
            best_model_path = os.path.join(MODEL_DIR, 'fold_%s' % fold, 'model_VGG19_%d.pth' % \
                (100*val_f2_score))
            logger.info("Saving model to %s" % best_model_path)
            save_model(model, best_model_path)
Пример #6
0
def train(model, epochs, train_dl, val_dl):
    best_score = 0.0
    # create optimizer with differential learning rates
    optimizer = create_optimizer(model, BASE_OPTIMIZER, args.init_lr_0,
                                 DIFF_LR_FACTORS)
    iterations = epochs * len(train_dl)
    idx = 0
    for epoch in range(epochs):
        lr0 = lr_scheduler(epoch, args.lr_decay_factor, args.init_lr_0,
                           args.lr_decay_epoch)  # set base lr for this epoch
        optimizer = create_optimizer(model, BASE_OPTIMIZER, lr0,
                                     DIFF_LR_FACTORS)
        total_loss = 0
        # training loop
        for batch_idx, (data, target) in enumerate(train_dl):
            data, target = data.cuda().float(), target.cuda().float()
            output = model(data)
            loss = F.binary_cross_entropy_with_logits(output, target)
            total_loss += loss.item()
            optimizer.zero_grad()
            loss.backward()
            optimizer.step()
            idx += 1
            # unfreeze deeper layers sequentially
            if idx == int(0.1 * iterations):
                model.unfreeze(1)
                logger.info("Iteration %d: Unfreezing group 1" % idx)
            if idx == int(0.2 * iterations):
                model.unfreeze(0)
                logger.info("Iteration %d: Unfreezing group 0" % idx)
            if batch_idx % 100 == 0:
                logger.info("Epoch %d (Batch %d / %d)\t Train loss: %.3f" % \
                    (epoch+1, batch_idx, len(train_dl), loss.item()))
        # train loss
        train_loss = total_loss / len(train_dl)
        logger.info("Epoch %d\t Train loss: %.3f" % (epoch + 1, train_loss))
        mlflow.log_metric('train_loss', train_loss, step=epoch)
        # validation scores
        val_f2_score, val_loss = validate(model, val_dl, 0.2)
        logger.info("Epoch %d \t Validation loss: %.3f, F2 score: %.3f" % \
            (epoch+1, val_loss, val_f2_score))
        mlflow.log_metric('val_loss', val_loss, step=epoch)
        mlflow.log_metric('val_f2_score', val_f2_score, step=epoch)
        # model saving
        if val_f2_score > best_score:
            best_score = val_f2_score
            best_model_path = os.path.join(MODEL_DIR, 'model_resnet34_%d.pth' % \
                (100*val_f2_score))
            logger.info("Saving model to %s" % best_model_path)
            save_model(model, best_model_path)
Пример #7
0
        bar.finish()

        result = model.evaluate_generator(
            (current_queue.get() for _ in range(validation_batches)),
            steps=validation_batches)

        process = processes.pop(0)
        process.terminate()

        processes.append(
            mp.Process(target=get_datasets,
                       args=(current_output % threads, output_queues)))
        processes[-1].start()

        current_output += 1
        end = timer()

        print(
            'train_loss: {:.4f} | train_acc: {:.4f} | test_loss: {:.4f} | test_acc: {:.4f} | epoch_time: {:.1f}'
            .format(train_loss / train_batches, train_acc / train_batches,
                    result[0], result[1], end - start))

        formatted_directory_name = 'models/{}/'.format(model_directory)
        formatted_model_name = '{}-{}-{:.4f}-{:.4f}'.format(
            model_name, e, train_acc / train_batches, result[1])
        save_model(model, formatted_directory_name, formatted_model_name)

    for process in processes:
        process.terminate()
Y_train = np_utils.to_categorical(encoded_Y_train)

# coverting testing output to one-hot representation
encoded_Y_test = encoder.transform(np.ravel(Y_test))
Y_test = np_utils.to_categorical(encoded_Y_test)

# defining the deep learning model model
model = Sequential()
model.add(Dense(8, input_dim=3, activation='relu'))
model.add(Dense(3, activation='softmax'))

# compile the model
model.compile(loss='categorical_crossentropy',
              optimizer='adam',
              metrics=['accuracy'])

# fit the model and save the history
hist = model.fit(X_train, Y_train, epochs=1000, verbose=0)

# test the performance of the model
test_model(Y_test, X_test, model)

# print the prediction
# print(predict_category(model, encoder, 5.6, 3, 4.5))

# plot the loss of the training proccess
plot_history(hist)

# save the model and weights
save_model(model)
 def save_best(self, name='best'):
     hf.save_model(self.model, self.name + '/' + name, folder=output_folder)
Пример #10
0
                         cls_loss_decoder_outputs_i_j_i)

        rec_loss.backward()
        cls_loss.backward()

        encoder_optimizer.step()
        decoder_optimizer.step()
        classifier_optimizer.step()

        total_loss = rec_loss.item() + cls_loss.item()
        # print('-', total_loss)
        c = write_to_board(
            writer, total_loss, rec_loss, cls_loss,
            (acc_i_i, acc_i_j, acc_i_j_i),
            [recall_tuple_i_i, recall_tuple_i_j, recall_tuple_i_j_i], c)

        if batch_idx % show_every == 0:  # and batch_idx != 0:
            show_reconstructions(input_text=input_text,
                                 reconstruction_i_i=reconstruction_i_i,
                                 reconstruction_i_j=reconstruction_i_j,
                                 reconstruction_i_j_i=reconstruction_i_j_i,
                                 first_few=1)

        # Save the model
        if min_loss > total_loss:
            save_model(enc, dec, epoch_number)
            min_loss = total_loss

writer.close()

create_gif(cfg.losses_dir)
Пример #11
0
        for val_loss in cb.val_losses:
            val_losses.append(val_loss)

        fn = output_folder + model.name + '/lr_log.txt'
        try:
            os.remove(fn)
        except Exception:
            pass

        thefile = open(fn, 'w')
        for lr in lrs:
            thefile.write("%s\n" % str(lr))

        thefile.close()

    hf.save_model(model, model.name)
    hf.save_training_plot(losses,
                          val_losses,
                          lrs,
                          model_name=model.name,
                          plot_folder=output_folder)
# except Exception as e:
#     import yagmail
#     yag = yagmail.SMTP('*****@*****.**', 'testchpc1')
#     body = 'Training CNN failed! \n \n  Args: ' + str(args) + ' \n Exception: ' + str(e)
#     yag.send('*****@*****.**', 'CNN Training failed for some reason', body)

##

# EoF #
Пример #12
0
 def save_best(self, name='best'):
     hf.save_model(self.model, self.name + '/' + name, folder=output_folder)
     self.model_simple.set_weights(self.model.get_weights())
     hf.save_model(self.model_simple,
                   self.name + '/' + name + '_simple',
                   folder=output_folder)
Пример #13
0
def train_classifier(train_set,
                     dev_set,
                     num_iterations,
                     models,
                     roulette,
                     elitism=8):
    length = len(train_set)
    population_size = len(models)

    batch_size = 100
    population = models

    for epoch in range(num_iterations):
        np.random.shuffle(train_set)
        avg_loss = 0
        print '\nbegan doing epoch no.', epoch + 1
        s_time = time.time()
        for batch_index in range(0, length, batch_size):
            batch_x = train_set[batch_index:batch_index + batch_size, :-1]
            batch_y = train_set[batch_index:batch_index + batch_size,
                                -1].astype(dtype=int)
            for m in population:
                m.loss_mini_batch(batch_x, batch_y)
            population.sort(key=operator.attrgetter('batch_loss'))

            avg_loss += population[0].batch_loss
            if batch_index % 1000 == 0 and batch_index != 0:
                e_time = time.time()
                print '\t', batch_index / float(length), '% complete. took:', e_time - s_time,\
                    'average loss <-', avg_loss / 1000
                avg_loss = 0
                s_time = time.time()
            if batch_index % 5000 == 0 and batch_index != 0:
                print '\taccuracy on dev: best:', accuracy_on_dataset(dev_set, population[0]),\
                    'loss of best:', '%.2f' % (population[0].batch_loss / batch_size), \
                    '\n\taccuracy on dev: worst:', accuracy_on_dataset(dev_set, population[-1]), \
                    'loss of worst:', '%.2f' % (population[-1].batch_loss / batch_size)

            new_population = []
            for e in range(elitism):
                new_population.append(population[e][1])

            for c in range(0, population_size - elitism, 2):
                p1_index = rand.choice(roulette)
                p2_index = rand.choice(roulette)

                parent1 = population[p1_index][1]
                parent2 = population[p2_index][1]

                child1, child2 = parent1.crossover(parent2)
                if rand.randint(0, 2) == 1:
                    child1.mutate()
                if rand.randint(0, 2) == 1:
                    child2.mutate()

                new_population.append(child1)
                new_population.append(child2)

            population = new_population
        train_accuracy = accuracy_on_dataset(train_set, population[0])
        dev_accuracy = accuracy_on_dataset(dev_set, population[0])
        print '****** EPOCH SUMMARY', epoch + 1, train_accuracy, dev_accuracy
        print '****** saving population...'
        count = 0
        for m in population:
            save_model(m, '../saved_models/ga200' + str(count) + '.mdl')
            count += 1
Пример #14
0
                                        nb_filters[n]) + '_' + str(
                                            nb_epoch[o]) + '_' + str(DA[p])
                                print('Starting : ' + name)

                                model.name = name
                                model.compile(loss=loss, optimizer='adadelta')
                                val_loss = hf.run_model(model,
                                                        X_train,
                                                        Y_train,
                                                        X_test,
                                                        Y_test,
                                                        nb_epoch=nb_epoch[o],
                                                        drops=drops,
                                                        batch_size=batch_size,
                                                        DA=DA[p])
                                hf.save_model(model, name=name)
                                outputs = hf.predict_outputs(model,
                                                             X_test,
                                                             target_dim=(256,
                                                                         256,
                                                                         1))
                                hf.display_distribution_of_outputs_regression(
                                    outputs,
                                    Y_test,
                                    name,
                                    display=display,
                                    output_folder=name)
                                if attempt < 5:
                                    model2 = cg.simple_CNN1(
                                        nb_dense=nb_dense[i],
                                        final_relu=final_relu[j],
Пример #15
0
data_directory = parsed_results.data_directory
checkpoint = parsed_results.save_path
pretrained_model = parsed_results.pretrained_model
lr = float(parsed_results.lr)
hidden_units = int(parsed_results.hidden_units)                       
epochs = int(parsed_results.num_epochs)
device_flag = bool(parsed_results.use_gpu)
                       
# Load datasets
train_data,test_data,validationdata,trainloader,testloader,validationloader = data_load(data_directory)

# Load pre-trained model
model = getattr(models,pretrained_model)(pretrained = True)

# Modify classifier based on current dataset
model = modify_classifier(model,model.classifier[0].in_features,device_flag)

# Initialize loss and optimizer
criterion = nn.NLLLoss()
optimizer = optim.Adam(model.classifier.parameters(), lr)

# Train the model on the dataset
model, optimizer = train_model(3,50,model,trainloader,criterion,optimizer,validationloader,device_flag)

# Use the test dataset for accuracy
test_accuracy(model,testloader,device_flag)

# Save the model onto disk
save_model(model,checkpoint,train_data,optimizer)