예제 #1
0
def train(epoch):
    print('\nEpoch: %d' % epoch)
    global Train_acc
    net.train()
    train_loss = 0
    correct = 0
    total = 0

    for batch_idx, (inputs, targets) in enumerate(trainloader):
        if use_cuda:
            inputs, targets = inputs.cuda(), targets.cuda()
        optimizer.zero_grad()
        #inputs, targets = Variable(inputs), Variable(targets)
        outputs = net(inputs)
        loss = criterion(outputs, targets)
        loss.backward()
        utils.clip_gradient(
            optimizer, 0.1)  #clip_gradient能有效了控制梯度爆炸的影响,使得最终的loss能下降到满意的结果
        optimizer.step()

        train_loss += loss.item()
        _, predicted = torch.max(outputs.data, 1)
        total += targets.size(0)
        correct += predicted.eq(targets.data).cpu().sum()

        utils.progress_bar(
            batch_idx, len(trainloader), 'Loss: %.3f | Acc: %.3f%% (%d/%d)' %
            (train_loss /
             (batch_idx + 1), 100. * correct / total, correct, total))

    Train_acc = 100. * correct / total
예제 #2
0
def test(epoch):
    global Test_acc
    global best_Test_acc
    global best_Test_acc_epoch
    net.eval()
    PrivateTest_loss = 0
    correct = 0
    total = 0
    for batch_idx, (inputs, targets) in enumerate(testloader):
        bs, ncrops, c, h, w = np.shape(inputs)
        inputs = inputs.view(-1, c, h, w)

        if use_cuda:
            inputs, targets = inputs.cuda(), targets.cuda()

        inputs, targets = Variable(inputs), Variable(targets)
        outputs = net(inputs)
        outputs_avg = outputs.view(bs, ncrops, -1).mean(1)  # avg over crops

        loss = criterion(outputs_avg, targets)
        PrivateTest_loss += loss.item()
        _, predicted = torch.max(outputs_avg.data, 1)
        total += targets.size(0)
        correct += predicted.eq(targets.data).cpu().sum()

        utils.progress_bar(batch_idx, len(testloader), 'Loss: %.3f | Acc: %.3f%% (%d/%d)'
            % (PrivateTest_loss / (batch_idx + 1), \
            100. * correct / total, correct, total))
    # Save checkpoint.
    Test_acc = 100. * correct / total

    if Test_acc > best_Test_acc:
        print('Saving..')
        print("best_Test_acc: %0.3f" % Test_acc)
        state = {
            'net': net.state_dict() if use_cuda else net,
            'best_Test_acc': Test_acc,
            'best_Test_acc_epoch': epoch,
        }
        if not os.path.isdir(opt.dataset + '_' + 'ShuffleNetV2'):
            os.mkdir(opt.dataset + '_' + 'ShuffleNetV2')
        if not os.path.isdir(path):
            os.mkdir(path)
        #torch.save(state, os.path.join(path, str(best_Test_acc) + '_ShuffleNetV2.pth'))
        best_Test_acc = Test_acc
        best_Test_acc_epoch = epoch
        torch.save(
            state,
            os.path.join(
                path,
                str(best_Test_acc) + '_' + str(input_size) +
                '_ShuffleNetV2.pth'))
예제 #3
0
def train(epoch):
    print('\nEpoch: %d' % epoch)
    global Train_acc
    net.train()
    train_loss = 0
    correct = 0
    total = 0
    '''
    if epoch > learning_rate_decay_start and learning_rate_decay_start >= 0:
        frac = (epoch - learning_rate_decay_start) // learning_rate_decay_every
        decay_factor = learning_rate_decay_rate ** frac
        current_lr = opt.lr * decay_factor
        utils.set_lr(optimizer, current_lr)  # set the decayed rate
    else:
        current_lr = opt.lr
    print('learning_rate: %s' % str(current_lr))
    '''

    for batch_idx, (inputs, targets) in enumerate(trainloader):
        if use_cuda:
            inputs, targets = inputs.cuda(), targets.cuda()
        optimizer.zero_grad()
        inputs, targets = Variable(inputs), Variable(targets)
        outputs = net(inputs)
        loss = criterion(outputs, targets)
        loss.backward()
        utils.clip_gradient(optimizer, 0.1)
        optimizer.step()

        train_loss += loss.item()
        _, predicted = torch.max(outputs.data, 1)
        total += targets.size(0)
        correct += predicted.eq(targets.data).cpu().sum()

        utils.progress_bar(
            batch_idx, len(trainloader), 'Loss: %.3f | Acc: %.3f%% (%d/%d)' %
            (train_loss /
             (batch_idx + 1), 100. * correct / total, correct, total))

    Train_acc = 100. * correct / total
예제 #4
0
    def train(self, nb_epochs, data_loader):
        """Train model on data"""

        # Initialize tracked quantities and prepare everything
        G_all_losses, D_all_losses, times = [], [], utils.AvgMeter()
        utils.format_hdr(self.gan, self.root_dir, self.train_len)
        start = datetime.datetime.now()

        g_iter, d_iter = 0, 0

        # Train
        for epoch in range(nb_epochs):
            print('EPOCH {:d} / {:d}'.format(epoch + 1, nb_epochs))
            G_losses, D_losses = utils.AvgMeter(), utils.AvgMeter()
            start_epoch = datetime.datetime.now()

            avg_time_per_batch = utils.AvgMeter()
            # Mini-batch SGD
            for batch_idx, (x, _) in enumerate(data_loader):

                # Critic update ratio
                if self.gan_type == 'wgan':
                    n_critic = 20 if g_iter < 50 or (
                        g_iter + 1) % 500 == 0 else self.n_critic
                else:
                    n_critic = self.n_critic

                # Training mode
                self.gan.G.train()

                # Discard last examples to simplify code
                if x.size(0) != self.batch_size:
                    break
                batch_start = datetime.datetime.now()

                # Print progress bar
                utils.progress_bar(batch_idx, self.batch_report_interval,
                                   G_losses.avg, D_losses.avg)

                x = Variable(x)
                if torch.cuda.is_available() and self.use_cuda:
                    x = x.cuda()

                # Update discriminator
                D_loss, fake_imgs = self.gan.train_D(x, self.D_optimizer,
                                                     self.batch_size)
                D_losses.update(D_loss, self.batch_size)
                d_iter += 1

                # Update generator
                if batch_idx % n_critic == 0:
                    G_loss = self.gan.train_G(self.G_optimizer,
                                              self.batch_size)
                    G_losses.update(G_loss, self.batch_size)
                    g_iter += 1

                batch_end = datetime.datetime.now()
                batch_time = int(
                    (batch_end - batch_start).total_seconds() * 1000)
                avg_time_per_batch.update(batch_time)

                # Report model statistics
                if (batch_idx % self.batch_report_interval == 0 and batch_idx) or \
                    self.batch_report_interval == self.num_batches:
                    G_all_losses.append(G_losses.avg)
                    D_all_losses.append(D_losses.avg)
                    utils.show_learning_stats(batch_idx, self.num_batches,
                                              G_losses.avg, D_losses.avg,
                                              avg_time_per_batch.avg)
                    [
                        k.reset()
                        for k in [G_losses, D_losses, avg_time_per_batch]
                    ]
                    self.eval(100, epoch=epoch, while_training=True)
                    # print('Critic iter: {}'.format(g_iter))

                # Save stats
                if batch_idx % self.save_stats_interval == 0 and batch_idx:
                    stats = dict(G_loss=G_all_losses, D_loss=D_all_losses)
                    self.save_stats(stats)

            # Save model
            utils.clear_line()
            print('Elapsed time for epoch: {}'.format(
                utils.time_elapsed_since(start_epoch)))
            self.gan.save_model(self.ckpt_path, epoch)
            self.eval(100, epoch=epoch, while_training=True)

        # Print elapsed time
        elapsed = utils.time_elapsed_since(start)
        print('Training done! Total elapsed time: {}\n'.format(elapsed))

        return G_loss, D_loss