コード例 #1
0
def main(config, resume):
    # Dataset
    fine_dataset = self_defined_dataset(config)
    # Dataloder
    train_loader = DataLoader(fine_dataset,
                              shuffle=True,
                              batch_size=config['batch_size'],
                              num_workers=8)
    val_loader = DataLoader(fine_dataset,
                            shuffle=False,
                            batch_size=config['batch_size'],
                            num_workers=8)
    test_loader = DataLoader(fine_dataset,
                             shuffle=False,
                             batch_size=config['batch_size'],
                             num_workers=8)
    # Model
    start_epoch = 0
    if config['model_name'].startswith('resnet'):
        model = ResNet(config)
    elif config['model_name'].startswith('densenet'):
        model = DenseNet(config)

    device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
    #Optimizer
    optimizer = torch.optim.Adam(model.parameters(),
                                 lr=config['learning_rate'],
                                 weight_decay=1e-5)
    # if use pretrained models
    if resume:
        filepath = config['pretrain_path']
        start_epoch, learning_rate, optimizer = load_ckpt(model, filepath)
        start_epoch += 1
    # if use multi-GPU
    if torch.cuda.device_count() > 1:
        print("Let's use", torch.cuda.device_count(), "GPUs!")
        model = nn.DataParallel(model)
    model.to(device)
    #resume or not
    if start_epoch == 0:
        print("Grand New Training")
    scheduler = torch.optim.lr_scheduler.ReduceLROnPlateau(
        optimizer, patience=config['switch_learning_rate_interval'])
    if not resume:
        learning_rate = config['learning_rate']
    # training part
    if config['if_train']:
        for epoch in range(start_epoch + 1,
                           start_epoch + config['num_epoch'] + 1):
            loss_tr = train(
                train_loader, model, optimizer, epoch,
                config)  #if training, delete learning rate and add optimizer
            if config['if_valid'] and epoch % config[
                    'valid_epoch_interval'] == 0:
                with torch.no_grad():
                    loss_val = valid(val_loader, model, epoch, config)
                    scheduler.step(loss_val)
                save_ckpt(model, optimizer, epoch, loss_tr, loss_val, config)
    test(test_loader, model, config)
    #store_config(config)
    print("Training finished ...")
コード例 #2
0
def main():
    """
    """
    exp_path = Path.cwd()
    torch.cuda.empty_cache()
    # get user to choose training config
    config_file = "ResNet.json"
    # Load Test Parameters
    with open(config_file, "r") as f:
        x = json.load(f)
    hyperparams = x["HYPERPARAMETERS"]
    name = x["model"]

    n_bands = hyperparams['n_bands']
    patch_size = hyperparams['patch_size']
    _, path = utils.experiment_path_build(x)

    c_drive_docs = Path(x["LOGGING"]["log_location"])
    log_file = Path(x["LOGGING"]["log_file"])
    default_device = torch.device(
        'cuda:0' if torch.cuda.is_available() else 'cpu')
    # Parameters
    validation_split = hyperparams["validation_split"]
    test_split = hyperparams["test_split"]
    random_seed = x["BASIC_PARAMETERS"]["random_seed"]
    shuffle_dataset = x["LOCATIONS"]["shuffle_dataset"]
    disp_batch = hyperparams["disp_batch"]  # images to display on test
    epochs = hyperparams["epoch"]
    bs = hyperparams["batch_size"]
    n_jobs = x["BASIC_PARAMETERS"]["n_jobs"]
    lr = hyperparams["learning_rate"]

    HSI_ds = HSI_Dataset(path)
    _, classes = utils.get_classes(path)
    num_classes = len(classes)

    train_ds_sampler, valid_ds_sampler, test_ds_sampler = train_test_valid_split(
        HSI_ds, shuffle_dataset, validation_split, test_split, random_seed)

    phases = make_phases(HSI_ds, train_ds_sampler,
                         valid_ds_sampler, test_ds_sampler, bs=32, n_jobs=4, disp_batch=disp_batch)
    model = Net(ResidualBlock, [2, 4, 8], in_channels=n_bands,
                num_classes=num_classes).to(default_device)
    # Lee Model Call
    # model = Net(n_bands, n_classes, patch_size)
    opt = optim.Adam(model.parameters(), lr=1e-2)
    training_params = {'Dataset Path': path,
                       'Experiment Path': exp_path,
                       'number of classes': num_classes,
                       'number of bands': n_bands,
                       'patch size': patch_size,
                       'test_train Split': {
                           'validation split': validation_split,
                           'shuffle dataset': shuffle_dataset,
                           'random seed': random_seed},
                       'Batch Size': bs,
                       "Number of Jobs": n_jobs,
                       "Learning Rate": lr,
                       "Scheduler": "One Cycle Schedule"
                       }

    cb = CallbacksGroup([
        RollingLoss(),
        Accuracy(),
        Scheduler(
            OneCycleSchedule(t=len(phases[0].loader) * epochs),
            mode='batch'
        ),
        StreamLogger(),
        CSVLogger(c_drive_docs.joinpath(log_file), training_params),
        ProgressBar(),
        save_model(c_drive_docs, name),
        test_images(path=c_drive_docs, batch_size=5, classes=classes)
    ])
    # save_model(exp_path, name)
    train(model, opt, phases, cb, epochs=epochs,
          device=default_device, loss_fn=F.cross_entropy)
    lr_history = pd.DataFrame(cb['scheduler'].parameter_history('lr'))
    ax = lr_history.plot(figsize=(8, 6))
    ax.set_xlabel('Training Batch Index')
    ax.set_ylabel('Learning Rate')
    fig = ax.get_figure()
    file_loc = [str(c_drive_docs) + "\\checkpoints\\lr-test.jpg"]
    s = ""
    s = s.join(file_loc)
    conf_path = Path(s)
    fig.savefig(conf_path)
コード例 #3
0
                label = labels[i]
                class_correct[label] += c[i].item()
                class_total[label] += 1

    for i in range(10):
        print('Accuracy of %5s : %2d %%' % (classes[i], 100 * class_correct[i] / class_total[i]))

        

if __name__ == '__main__':
    # Loading and normalizing CIFAR10
    trainloader, testloader, classes = data_prepare()
    # Define a Convolutional Neural Network
    net = ResNet()
    net = net.cuda()
#     x = torch.autograd.Variable(torch.rand(64, 3, 32, 32))
#     writer.add_graph(net, x.cuda(), verbose=True)
    if args.load_model == True:
        net.load_state_dict(torch.load(args.model_path))
    # Define a Loss function and optimizer
    criterion = nn.CrossEntropyLoss()
    optimizer = optim.Adam(net.parameters(), lr=1e-4, betas=(0.9, 0.999),
        eps=1e-08, weight_decay=0., amsgrad=True)
    # Train the network
    for epoch in range(args.epochs):
        train(net, criterion, optimizer, trainloader, epoch)
        test(net, criterion, testloader, epoch)
    model_path = './cifar_net.pth'
    torch.save(net.state_dict(), model_path)
    
"Reference: https://pytorch.org/tutorials/beginner/blitz/cifar10_tutorial.html"
コード例 #4
0
ファイル: main.py プロジェクト: Ryanrenqian/AI_HW
    for i in range(10):
        print('Accuracy of %5s : %2d %%' %
              (classes[i], 100 * class_correct[i] / class_total[i]))


if __name__ == '__main__':
    # Loading and normalizing CIFAR10
    trainloader, testloader, classes = data_prepare()
    # Define a Convolutional Neural Network
    net = ResNet()
    net = net.cuda()
    x = torch.autograd.Variable(torch.rand(64, 3, 32, 32))
    writer.add_graph(net, x.cuda(), verbose=True)
    if args.load_model == True:
        net.load_state_dict(torch.load(args.model_path))
    # Define a Loss function and optimizer
    criterion = nn.CrossEntropyLoss()
    optimizer = optim.Adam(net.parameters(),
                           lr=1e-4,
                           betas=(0.9, 0.999),
                           eps=1e-08,
                           weight_decay=0.,
                           amsgrad=True)
    # Train the network
    for epoch in range(args.epochs):
        train(net, criterion, optimizer, trainloader, epoch)
        test(net, criterion, testloader, epoch)
    model_path = './cifar_net.pth'
    torch.save(net.state_dict(), model_path)

"Reference: https://pytorch.org/tutorials/beginner/blitz/cifar10_tutorial.html"
コード例 #5
0
def train_and_valid(learning_rate=lr,
                    weight_decay=weight_decay,
                    num_of_res=num_of_res_blocks,
                    if_bottleneck=bottle,
                    plot=True):
    """
    Train the model and run it on the valid set every epoch
    :param weight_decay: for L2 regularzition
    :param bottleneck:
    :param num_of_res:
    :param learning_rate: lr
    :param plot: draw the train/valid loss curve or not
    :return:
    """
    curr_lr = learning_rate
    # model define
    if NET_TYPE == 'res':
        if DATA_TYPE == 'hoa':
            block = ResBlock(128, 128, bottleneck=if_bottleneck)
        else:
            block = ResBlock(256, 256, bottleneck=if_bottleneck)
        model = ResNet(block,
                       numOfResBlock=num_of_res,
                       input_shape=input_shape,
                       data_type=DATA_TYPE).to(device)
    elif NET_TYPE == 'hoa':
        model = HOANet(input_shape=input_shape).to(device)
    else:
        raise RuntimeError('Unrecognized net type!')
    # print(model)

    criterion = nn.MSELoss()
    optimizer = torch.optim.Adam(model.parameters(),
                                 lr=learning_rate,
                                 weight_decay=weight_decay)

    # These parameters are for searching the best epoch to early stopping
    train_loss_curve, valid_loss_curve = [], []
    best_loss, avr_valid_loss = 10000.0, 0.0

    best_epoch = 0
    best_model = None  # the best parameters

    for epoch in range(num_epochs):
        # 每一轮的 训练集/验证集 误差
        train_loss_per_epoch, valid_loss_per_epoch = 0.0, 0.0
        train_step_cnt, valid_step_cnt = 0, 0

        train_data, valid_data = [], []
        # 进入训练模式
        model.train()
        random.shuffle(train_file_order)

        for idx, train_idx in enumerate(train_file_order):
            if len(train_data) < batch_size:
                train_data_temp = HOADataSet(
                    path=DATA_PATH + ('' if DATA_TYPE == 'hoa' else 'STFT/') +
                    'tr/',
                    index=train_idx + 1,
                    data_type=DATA_TYPE,
                    is_speech=SPEECH)
                if len(train_data) == 0:
                    train_data = train_data_temp
                else:
                    train_data += train_data_temp
                continue

            train_loader = data.DataLoader(dataset=train_data,
                                           batch_size=batch_size,
                                           shuffle=True)

            for step, (examples, labels) in enumerate(train_loader):
                # if step == 1:
                #     break
                train_step_cnt += 1
                # print(train_step_cnt)
                examples = examples.float().to(device)
                labels = labels.float().to(device)
                outputs = model(examples)
                train_loss = criterion(outputs, labels)
                train_loss_per_epoch += train_loss.item()

                # Backward and optimize
                optimizer.zero_grad()
                train_loss.backward()
                optimizer.step()

                logger.info(
                    "Epoch [{}/{}], Step {}, train Loss: {:.4f}".format(
                        epoch + 1, num_epochs, train_step_cnt,
                        train_loss.item()))

            train_data = HOADataSet(path=DATA_PATH +
                                    ('' if DATA_TYPE == 'hoa' else 'STFT/') +
                                    'tr/',
                                    index=train_idx + 1,
                                    data_type=DATA_TYPE,
                                    is_speech=SPEECH)

        if plot:
            train_loss_curve.append(train_loss_per_epoch / train_step_cnt)

        if running_lr and epoch > 1 and (epoch + 1) % 2 == 0:
            curr_lr = curr_lr * (1 - decay)
            update_lr(optimizer, curr_lr)

        # valid every epoch
        # 进入验证模式

        model.eval()
        with torch.no_grad():
            for idx, valid_idx in enumerate(valid_file_order):
                if len(valid_data) < batch_size:
                    valid_data_temp = HOADataSet(
                        path=DATA_PATH +
                        ('' if DATA_TYPE == 'hoa' else 'STFT/') + 'cv/',
                        index=valid_idx + 1,
                        data_type=DATA_TYPE,
                        is_speech=SPEECH)
                    if len(valid_data) == 0:
                        valid_data = valid_data_temp
                    else:
                        valid_data += valid_data_temp
                    continue

                valid_loader = data.DataLoader(dataset=valid_data,
                                               batch_size=batch_size,
                                               shuffle=True)

                for step, (examples, labels) in enumerate(valid_loader):
                    valid_step_cnt += 1
                    # print(valid_step_cnt)
                    examples = examples.float().to(device)
                    labels = labels.float().to(device)

                    outputs = model(examples)
                    valid_loss = criterion(outputs, labels)
                    valid_loss_per_epoch += valid_loss.item()

                    logger.info(
                        'The loss for the current batch:{}'.format(valid_loss))

                valid_data = HOADataSet(
                    path=DATA_PATH + ('' if DATA_TYPE == 'hoa' else 'STFT/') +
                    'cv/',
                    index=valid_idx + 1,
                    data_type=DATA_TYPE,
                    is_speech=SPEECH)

            avr_valid_loss = valid_loss_per_epoch / valid_step_cnt

            logger.info(
                'Epoch {}, the average loss on the valid set: {} '.format(
                    epoch, avr_valid_loss))

            valid_loss_curve.append(avr_valid_loss)
            if avr_valid_loss < best_loss:
                best_loss = avr_valid_loss
                best_epoch, best_model = epoch, model.state_dict()

    # end for loop of epoch
    torch.save(
        {
            'epoch': best_epoch,
            'state_dict': best_model,
            'loss': best_loss,
        }, './models/ckpoint_' + CUR_TASK + '_bot' + str(int(if_bottleneck)) +
        '_lr' + str(learning_rate) + '_wd' + str(weight_decay) + '_#res' +
        str(num_of_res) + '.tar')

    logger.info('best epoch:{}, valid loss:{}'.format(best_epoch, best_loss))
    if plot:
        x = np.arange(num_epochs)
        fig, ax = plt.subplots(1, 1)
        ax.plot(x, train_loss_curve, 'b', label='Train Loss')
        ax.plot(x, valid_loss_curve, 'r', label='Valid Loss')
        plt.legend(loc='upper right')
        plt.savefig(name + '.jpg')
        plt.close()
コード例 #6
0
def main(config, resume, phase):
    # Dataset
    fine_dataset = fine_clustering_dataset(config)
    # Dataloder
    train_loader = DataLoader(fine_dataset,
                              shuffle=True,
                              batch_size=config['batch_size'],
                              num_workers=32)
    val_loader = DataLoader(fine_dataset,
                            shuffle=False,
                            batch_size=config['batch_size'],
                            num_workers=32)
    test_loader = DataLoader(fine_dataset,
                             shuffle=False,
                             batch_size=config['batch_size'],
                             num_workers=32)
    # Model
    start_epoch = 0
    if config['model_name'].startswith('resnet'):
        model = ResNet(config)
    elif config['model_name'].startswith('densenet'):
        model = DenseNet(config)
    elif config['model_name'].startswith('deeplab'):
        cluster_vector_dim = config['cluster_vector_dim']
        model = DeepLabv3_plus(nInputChannels=3,
                               n_classes=3,
                               os=16,
                               cluster_vector_dim=cluster_vector_dim,
                               pretrained=True,
                               _print=True)
    elif config['model_name'].startswith('bagnet'):
        model = BagNet(config=config)

    device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
    if resume:
        filepath = config['pretrain_path']
        start_epoch, learning_rate, optimizer, M, s = load_ckpt(
            model, filepath)
        start_epoch += 1
    if torch.cuda.device_count() > 1:
        print("Let's use", torch.cuda.device_count(), "GPUs!")
        model = nn.DataParallel(model)
    model.to(device)
    #Optimizer
    optimizer = torch.optim.Adam(model.parameters(),
                                 lr=config['learning_rate'],
                                 weight_decay=1e-5)
    #resume or not
    if start_epoch == 0:
        print("Grand New Training")
    scheduler = torch.optim.lr_scheduler.ReduceLROnPlateau(
        optimizer, patience=config['switch_learning_rate_interval'])
    # log_dir = config['log_dir']+"/{}_{}_".format(config['date'],config['model_name'])+"ep_{}-{}_lr_{}".format(start_epoch,start_epoch+config['num_epoch'],config['learning_rate'])
    # best loss
    if not resume:
        learning_rate = config['learning_rate']
        M, s = cluster_initialization(train_loader, model, config, phase)
    print(start_epoch)
    if config['if_train']:
        for epoch in range(start_epoch + 1,
                           start_epoch + config['num_epoch'] + 1):
            loss_tr = train(
                train_loader, model, optimizer, epoch, config, M,
                s)  #if training, delete learning rate and add optimizer
            if config['if_valid'] and epoch % config[
                    'valid_epoch_interval'] == 0:
                with torch.no_grad():
                    loss_val, M, s = valid(val_loader, model, epoch, config,
                                           learning_rate, M, s, phase)
                    scheduler.step(loss_val)
                save_ckpt(model, optimizer, epoch, loss_tr, loss_val, config,
                          M, s)
            else:
                val_log = open("../log/val_" + config['date'] + ".txt", "a")
                val_log.write('epoch ' + str(epoch) + '\n')
                val_log.close()
    test(test_loader, model, config, M, phase)
    store_config(config, phase)
    print("Training finished ...")
コード例 #7
0
def train(img_dir, xml_dir, epochs, input_size, batch_size, num_classes):
    """
    params: 
          bins: number of bins for classification
          alpha: regression loss weight
          beta: ortho loss weight
    """
    # create model
    model = ResNet(torchvision.models.resnet50(pretrained=True),
                   num_classes=num_classes)

    cls_criterion = nn.CrossEntropyLoss().cuda(1)

    softmax = nn.Softmax(dim=1).cuda(1)
    model.cuda(1)

    # initialize learning rate and step
    lr = 0.001
    step = 0

    optimizer = torch.optim.Adam(model.parameters(), lr=lr)

    #load data
    train_data_loader = loadData(img_dir, xml_dir, input_size, batch_size,
                                 True)
    test_loader = loadData('../yolov3/data/test_imgs',
                           '../yolov3/data/test_anns', 224, 8, False)

    #variables
    history = []
    best_acc = 0.0
    best_epoch = 0

    # start training
    for epoch in range(epochs):
        print("Epoch:", epoch)
        print("------------")

        # reduce lr by lr_decay factor for each epoch
        if epoch % 10 == 0:
            lr = lr * 0.9

        train_loss = 0.0
        train_acc = 0
        val_acc = 0

        model.train()

        for i, (images, labels) in enumerate(train_data_loader):
            if i % 10 == 0:
                print("batch: {}/{}".format(
                    i,
                    len(train_data_loader.dataset) // batch_size))
            images = images.cuda(1)
            labels = labels.cuda(1)

            # backward
            optimizer.zero_grad()
            outputs = model(images)

            loss = cls_criterion(outputs, labels)
            loss.backward()
            optimizer.step()

            train_loss += loss.item()

            ret, predictions = torch.max(outputs.data, 1)
            correct_counts = predictions.eq(labels.data.view_as(predictions))

            acc = torch.mean(correct_counts.type(torch.FloatTensor))

            train_acc += acc.item() * images.size(0)

        print("epoch: {:03d}, Training loss: {:.4f}, Accuracy: {:.4f}%".format(
            epoch + 1, train_loss, train_acc / 3096 * 100))

        #if (epoch+1) % 3 == 0:
        #    torch.save(model, 'models/'+'model_'+str(epoch+1)+'.pt')
        print("Start testing...")
        with torch.no_grad():
            model.eval()

            for j, (images, labels) in enumerate(test_loader):
                images = images.cuda(1)
                labels = labels.cuda(1)

                outputs = model(images)

                ret, preds = torch.max(outputs.data, 1)
                cnt = preds.eq(labels.data.view_as(preds))

                acc = torch.mean(cnt.type(torch.FloatTensor))
                val_acc += acc.item() * images.size(0)

            if val_acc > best_acc:
                print("correct testing samples:", val_acc)
                best_acc = val_acc
                torch.save(model,
                           'models/' + 'model_' + str(epoch + 1) + '.pt')
コード例 #8
0
class ResNetPredictor:
    def __init__(self, model_path=None):
        """
        Params:
        model_path: Optional pretrained model file
        """
        # Initialize model
        self.model = ResNet().cuda()

        if model_path is not None:
            self.model.load_state_dict(torch.load(model_path))
            print('Model read from {}.'.format(model_path))

        print('Predictor initialized.')

    def fit(self, train_dataset_path, valid_dataset_path, model_dir, **training_args):
        """
        train_dataset_path: The path to the training dataset.pkl
        valid_dataset_path: The path to the validation dataset.pkl
        model_dir: The directory to save models for each epoch
        training_args:
          - batch_size
          - valid_batch_size
          - epoch
          - lr
          - save_every_epoch
        """
        # Set paths
        self.train_dataset_path = train_dataset_path
        self.valid_dataset_path = valid_dataset_path
        self.model_dir = model_dir
        Path(self.model_dir).mkdir(parents=True, exist_ok=True)

        # Set training params
        self.batch_size = training_args['batch_size']
        self.valid_batch_size = training_args['valid_batch_size']
        self.epoch = training_args['epoch']
        self.lr = training_args['lr']
        self.save_every_epoch = training_args['save_every_epoch']

        self.optimizer = optim.Adam(self.model.parameters(), lr=self.lr)
        self.onset_criterion = nn.BCEWithLogitsLoss()
        self.offset_criterion = nn.BCEWithLogitsLoss()
        self.pitch_criterion = nn.CrossEntropyLoss()

        # Read the datasets
        print('Reading datasets...')
        with open(self.train_dataset_path, 'rb') as f:
            self.training_dataset = pickle.load(f)
        with open(self.valid_dataset_path, 'rb') as f:
            self.validation_dataset = pickle.load(f)

        # Setup dataloader and initial variables
        self.train_loader = DataLoader(
            self.training_dataset,
            batch_size=self.batch_size,
            num_workers=4,
            pin_memory=True,
            shuffle=True,
            drop_last=True,
        )
        self.valid_loader = DataLoader(
            self.validation_dataset,
            batch_size=self.valid_batch_size,
            num_workers=4,
            pin_memory=True,
            shuffle=False,
            drop_last=False,
        )

        start_time = time.time()
        training_loss_list = []
        valid_loss_list = []

        # Start training
        self.iters_per_epoch = len(self.train_loader)
        for epoch in range(1, self.epoch + 1):
            self.model.train()

            # Run iterations
            total_training_loss = 0
            for batch_idx, batch in enumerate(self.train_loader):
                self.optimizer.zero_grad()

                # Parse batch data
                input_tensor = batch[0].permute(0, 2, 1).unsqueeze(1).cuda()
                osnet_prob, offset_prob, pitch_class = batch[1][:, 0].float().cuda(), batch[1][:, 1].float().cuda(), batch[1][:, 2].cuda()

                # Forward model
                onset_logits, offset_logits, pitch_logits = self.model(input_tensor)

                # Calculate loss
                loss = self.onset_criterion(onset_logits, osnet_prob) \
                    + self.offset_criterion(offset_logits, offset_prob) \
                    + self.pitch_criterion(pitch_logits, pitch_class)

                loss.backward()
                self.optimizer.step()

                total_training_loss += loss.item()

                # Free GPU memory
                # torch.cuda.empty_cache()

            if epoch % self.save_every_epoch == 0:
                # Perform validation
                self.model.eval()
                with torch.no_grad():
                    total_valid_loss = 0
                    for batch_idx, batch in enumerate(self.valid_loader):
                        # Parse batch data
                        input_tensor = batch[0].permute(0, 2, 1).unsqueeze(1).cuda()
                        osnet_prob, offset_prob, pitch_class = batch[1][:, 0].float().cuda(), batch[1][:, 1].float().cuda(), batch[1][:, 2].cuda()

                        # Forward model
                        onset_logits, offset_logits, pitch_logits = self.model(input_tensor)

                        # Calculate loss
                        loss = self.onset_criterion(onset_logits, osnet_prob) \
                            + self.offset_criterion(offset_logits, offset_prob) \
                            + self.pitch_criterion(pitch_logits, pitch_class)
                        total_valid_loss += loss.item()

                        # Free GPU memory
                        # torch.cuda.empty_cache()

                # Save model
                save_dict = self.model.state_dict()
                target_model_path = Path(self.model_dir) / 'e_{}'.format(epoch)
                torch.save(save_dict, target_model_path)

                # Save loss list
                training_loss_list.append((epoch, total_training_loss/self.iters_per_epoch))
                valid_loss_list.append((epoch, total_valid_loss/len(self.valid_loader)))

                # Epoch statistics
                print(
                    '| Epoch [{:4d}/{:4d}] Train Loss {:.4f} Valid Loss {:.4f} Time {:.1f}'.format(
                        epoch,
                        self.epoch,
                        training_loss_list[-1][1],
                        valid_loss_list[-1][1],
                        time.time()-start_time,
                    )
                )

        # Save loss to file
        with open('./plotting/data/loss.pkl', 'wb') as f:
            pickle.dump({'train': training_loss_list, 'valid': valid_loss_list}, f)

        print('Training done in {:.1f} minutes.'.format((time.time()-start_time)/60))

    def _parse_frame_info(self, frame_info):
        """Parse frame info [(onset_probs, offset_probs, pitch_class)...] into desired label format."""
        onset_thres = 0.25
        offset_thres = 0.25

        result = []
        current_onset = None
        pitch_counter = Counter()
        last_onset = 0.0
        for idx, info in enumerate(frame_info):
            current_time = FRAME_LENGTH*idx + FRAME_LENGTH/2

            if info[0] >= onset_thres:  # If is onset
                if current_onset is None:
                    current_onset = current_time
                    last_onset = info[0]
                elif info[0] >= onset_thres:
                    # If current_onset exists, make this onset a offset and the next current_onset
                    if pitch_counter.most_common(1)[0][0] != 49:
                        result.append([current_onset, current_time, pitch_counter.most_common(1)[0][0] + 36])
                    elif len(pitch_counter.most_common(2)) == 2:
                        result.append([current_onset, current_time, pitch_counter.most_common(2)[1][0] + 36])
                    current_onset = current_time
                    last_onset = info[0]
                    pitch_counter.clear()
            elif info[1] >= offset_thres:  # If is offset
                if current_onset is not None:
                    if pitch_counter.most_common(1)[0][0] != 49:
                        result.append([current_onset, current_time, pitch_counter.most_common(1)[0][0] + 36])
                    elif len(pitch_counter.most_common(2)) == 2:
                        result.append([current_onset, current_time, pitch_counter.most_common(2)[1][0] + 36])
                    current_onset = None
                    pitch_counter.clear()

            # If current_onset exist, add count for the pitch
            if current_onset is not None:
                pitch_counter[info[2]] += 1

        return result

    def predict(self, test_dataset):
        """Predict results for a given test dataset."""
        # Setup params and dataloader
        batch_size = 500
        test_loader = DataLoader(
            test_dataset,
            batch_size=batch_size,
            pin_memory=False,
            shuffle=False,
            drop_last=False,
        )

        # Start predicting
        results = []
        self.model.eval()
        with torch.no_grad():
            print('Forwarding model...')
            song_frames_table = {}
            for batch_idx, batch in enumerate(tqdm(test_loader)):
                # Parse batch data
                input_tensor = batch[0].unsqueeze(1).cuda()
                song_ids = batch[1]

                # Forward model
                onset_logits, offset_logits, pitch_logits = self.model(input_tensor)
                onset_probs, offset_probs, pitch_logits = torch.sigmoid(onset_logits).cpu(), torch.sigmoid(offset_logits).cpu(), pitch_logits.cpu()

                # Collect frames for corresponding songs
                for bid, song_id in enumerate(song_ids):
                    frame_info = (onset_probs[bid], offset_probs[bid], torch.argmax(pitch_logits[bid]).item())
                    song_frames_table.setdefault(song_id, [])
                    song_frames_table[song_id].append(frame_info)

            # Parse frame info into output format for every song
            results = {}
            for song_id, frame_info in song_frames_table.items():
                results[song_id] = self._parse_frame_info(frame_info)

        return results
コード例 #9
0
                                            transform=transforms.ToTensor())
train_loader = torch.utils.data.DataLoader(dataset=train_dataset,
                                           batch_size=opt.batch,
                                           shuffle=True)
test_loader = torch.utils.data.DataLoader(dataset=test_dataset,
                                          batch_size=opt.batch,
                                          shuffle=False)

classes = ('plane', 'car', 'bird', 'cat', 'deer', 'dog', 'frog', 'horse',
           'ship', 'truck')

net = ResNet()

# define optimization method
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(net.parameters(), lr=opt.lr, weight_decay=opt.wd)

if opt.is_gpu:
    net = net.cuda()
    net = torch.nn.DataParallel(net,
                                device_ids=range(torch.cuda.device_count()))
    cudnn.benchmark = True

start_epoch = 0

# train dataset
for epoch in range(start_epoch, opt.epochs + start_epoch):

    running_loss = 0.0
    for i, data in enumerate(train_loader, 0):
        # get the inputs; data is a list of [inputs, labels]