def train_pp(model, loss_fn, optimizer, param, loader_train, loader_test, ratio_list, k=3, loader_val=None):
    model.train()
    ratio_count = 0
    for epoch in range(param['num_epochs']):
        print('Starting epoch %d / %d' % (epoch + 1, param['num_epochs']))

        for t, (x, y) in enumerate(loader_train):
            x_var, y_var = to_var(x), to_var(y.long())

            scores = model(x_var)
            loss = loss_fn(scores, y_var)

            if (t + 1) % 100 == 0:
                print('t = %d, loss = %.8f' % (t + 1, loss.data[0]))

            optimizer.zero_grad()
            loss.backward()

            model.update_grad()
            optimizer.step()

        test(model, loader_test)

        if epoch%k == 0 and epoch!=0 and ratio_count<len(ratio_list):
            model.procedure_stb_pruning(ratio_list[ratio_count])
            # model.procedure_weight_pruning(ratio_list[ratio_count])

            ratio_count+=1
            print(ratio_count, 'th','###########################pruning once######################################')
def train_rand(model, loss_fn, optimizer, param, loader_train, loader_test, ratio, loader_val=None):
    model.train()
    model.rand_mask(ratio)
    for epoch in range(param['num_epochs']):
        print('Starting epoch %d / %d' % (epoch + 1, param['num_epochs']))

        for t, (x, y) in enumerate(loader_train):
            x_var, y_var = to_var(x), to_var(y.long())

            scores = model(x_var)
            loss = loss_fn(scores, y_var)

            if (t + 1) % 100 == 0:
                print('t = %d, loss = %.8f' % (t + 1, loss.data[0]))

            optimizer.zero_grad()
            loss.backward()

            optimizer.step()

        test(model, loader_test)
def test(model, loader):
    model.eval()

    num_correct, num_samples = 0, len(loader.dataset)
    for x, y in loader:
        x_var = to_var(x, volatile=True)
        scores = model(x_var)
        _, preds = scores.data.cpu().max(1)
        num_correct += (preds == y).sum()

    acc = float(num_correct) / num_samples

    print('Test accuracy: {:.2f}% ({}/{})'.format(
        100. * acc,
        num_correct,
        num_samples,
    ))

    return acc
def gen_mask(model,
             loss_fn,
             optimizer,
             param,
             loader_train,
             loader_test,
             ratio,
             k=3,
             loader_val=None):
    test(model, loader_test)

    model.train()
    count = 0
    ratio_ind = 0
    for epoch in range(param['num_epochs']):
        model.train()

        print('Starting epoch %d / %d' % (epoch + 1, param['num_epochs']))
        for t, (x, y) in enumerate(loader_train):
            x_var, y_var = to_var(x), to_var(y.long())

            scores = model(x_var)
            loss = loss_fn(scores, y_var)

            if (t + 1) % 100 == 0:
                print('t = %d, loss = %.8f' % (t + 1, loss.item()))

            optimizer.zero_grad()
            loss.backward()

            model.update_grad()

            optimizer.step()
            # print(epoch,t)
            # test(model, loader_test)

        if (epoch + 1) % k == 0 and ratio_ind < len(ratio):
            print(
                ' pruning some filters which are in convolution layes , pruning ratio:%.3f'
                % ratio[ratio_ind])
            if ratio_ind == 0:
                model.com_mask2(ratio[ratio_ind], 0)
            else:
                model.com_mask2(ratio[ratio_ind], ratio[ratio_ind - 1])
            model.set_masks(model.mask)

            model.zero_accmgrad()
            ratio_ind += 1

        else:
            model.set_masks(model.mask)
        prune_rate(model)

        print('modify learning rate')
        lr = param['learning_rate'] * (0.5**((epoch - k * len(ratio)) // 30))
        # lr = param['learning_rate'] * (0.5 ** ((epoch - 1) // 30))
        for param_group in optimizer.param_groups:
            param_group['lr'] = lr

        print('epoch', epoch)
        test(model, loader_test)
        count += 1
Beispiel #5
0
 def set_mask(self, mask):
     self.mask = to_var(mask, requires_grad=False)
     self.weight.data = self.weight.data.cuda() * self.mask.data
     self.mask_flag = True
Beispiel #6
0
def gen_mask(model,
             loss_fn,
             optimizer,
             param,
             loader_train,
             loader_test,
             ratio,
             k=3,
             loader_val=None):

    model.train()
    count = 0
    ratio_ind = 0
    for epoch in range(param['num_epochs']):
        model.train()

        print('Starting epoch %d / %d' % (epoch + 1, param['num_epochs']))
        for t, (x, y) in enumerate(loader_train):
            # print(t)
            x_var, y_var = to_var(x), to_var(y.long())

            # x_var = x.cuda();  y_var = y.long().cuda()

            scores = model(x_var)
            loss = loss_fn(scores, y_var)

            if (t + 1) % 100 == 0:
                print('t = %d, loss = %.8f' %
                      (t + 1, loss.item()))  #loss.data[0]))

            optimizer.zero_grad()
            loss.backward()

            optimizer.step()

        if (epoch + 1) % k == 0 and ratio_ind < len(ratio):
            print(
                ' pruning some filters which are in convolution layes , pruning ratio:%.3f'
                % ratio[ratio_ind])
            if ratio_ind == 0:
                model.com_mask3(ratio[ratio_ind], 0)
                model.set_masks(model.mask)
                print(model.layer_list)
                print(model.filters_array)
                print(len(model.filters_array))
                print('not prune')
                # model = prune_vgg(model, model.layer_list, model.filters_array)
                # init_model(model)
                # optimizer.params = model.parameters()

            else:
                model.com_mask3(ratio[ratio_ind], ratio[ratio_ind - 1])
                model.set_masks(model.mask)
                print(model.layer_list)
                print(model.filters_array)
                print(len(model.filters_array))
                print('not prune')

            ratio_ind += 1

        #  当所有的剪枝率满足之后,再训练k个epochs,然后再剪枝——因为比如剪到80的时候,会陷入10%的怪圈,见同where中的结果
        if epoch > k * (len(ratio) + 1):
            print(model.layer_list)
            print(model.filters_array)
            print(len(model.filters_array))
            print('real pruning')
            model = prune_vgg(model, model.layer_list, model.filters_array)
            return model

        print('modify learning rate')
        lr = param['learning_rate'] * (0.5**((epoch - k * len(ratio)) // 100))
        # lr = param['learning_rate'] * (0.5 ** ((epoch - 1) // 30))
        for param_group in optimizer.param_groups:
            param_group['lr'] = lr

        print('epoch', epoch)
        test(model, loader_test)
        count += 1

    return model
Beispiel #7
0
 def get_mask(self):
     # print(self.mask_flag)
     return to_var(self.mask, requires_grad=False)
 def get_mask(self):
     # if self.mask_flag == False :
     #     return None
     # else :
     return to_var(self.mask, requires_grad=False)