def test_torch_fpgm_pruner(self): """ With filters(kernels) weights defined as above (w), it is obvious that w[4] and w[5] is the Geometric Median which minimize the total geometric distance by defination of Geometric Median in this paper: Filter Pruning via Geometric Median for Deep Convolutional Neural Networks Acceleration, https://arxiv.org/pdf/1811.00250.pdf So if sparsity is 0.2, the expected masks should mask out w[4] and w[5], this can be verified through: `all(torch.sum(masks, (1, 2, 3)).numpy() == np.array([45., 45., 45., 45., 0., 0., 45., 45., 45., 45.]))` If sparsity is 0.6, the expected masks should mask out w[2] - w[7], this can be verified through: `all(torch.sum(masks, (1, 2, 3)).numpy() == np.array([45., 45., 0., 0., 0., 0., 0., 0., 45., 45.]))` """ model = TorchModel() config_list = [{'sparsity': 0.2, 'op_types': ['Conv2d']}, {'sparsity': 0.6, 'op_types': ['Conv2d']}] pruner = torch_compressor.FPGMPruner(model, config_list) model.conv2.weight.data = torch.tensor(w).float() layer = torch_compressor.compressor.LayerInfo('conv2', model.conv2) masks = pruner.calc_mask(layer, config_list[0]) assert all(torch.sum(masks, (1, 2, 3)).numpy() == np.array([45., 45., 45., 45., 0., 0., 45., 45., 45., 45.])) pruner.update_epoch(1) model.conv2.weight.data = torch.tensor(w).float() masks = pruner.calc_mask(layer, config_list[1]) assert all(torch.sum(masks, (1, 2, 3)).numpy() == np.array([45., 45., 0., 0., 0., 0., 0., 0., 45., 45.]))
def test_torch_fpgm_pruner(self): """ With filters(kernels) weights defined as above (w), it is obvious that w[4] and w[5] is the Geometric Median which minimize the total geometric distance by defination of Geometric Median in this paper: Filter Pruning via Geometric Median for Deep Convolutional Neural Networks Acceleration, https://arxiv.org/pdf/1811.00250.pdf So if sparsity is 0.2, the expected masks should mask out w[4] and w[5], this can be verified through: `all(torch.sum(masks, (1, 2, 3)).numpy() == np.array([125., 125., 125., 125., 0., 0., 125., 125., 125., 125.]))` If sparsity is 0.6, the expected masks should mask out w[2] - w[7], this can be verified through: `all(torch.sum(masks, (1, 2, 3)).numpy() == np.array([125., 125., 0., 0., 0., 0., 0., 0., 125., 125.]))` """ w = np.array([np.ones((5, 5, 5)) * (i + 1) for i in range(10)]).astype(np.float32) model = TorchModel() config_list = [{ 'sparsity': 0.6, 'op_types': ['Conv2d'] }, { 'sparsity': 0.2, 'op_types': ['Conv2d'] }] pruner = torch_compressor.FPGMPruner( model, config_list, torch.optim.SGD(model.parameters(), lr=0.01)) model.conv2.module.weight.data = torch.tensor(w).float() masks = pruner.calc_mask(model.conv2) assert all( torch.sum(masks['weight_mask'], (1, 2, 3)).numpy() == np.array( [125., 125., 125., 125., 0., 0., 125., 125., 125., 125.])) model.conv2.module.weight.data = torch.tensor(w).float() model.conv2.if_calculated = False model.conv2.config = config_list[0] masks = pruner.calc_mask(model.conv2) assert all( torch.sum(masks['weight_mask'], (1, 2, 3)).numpy() == np.array( [125., 125., 0., 0., 0., 0., 0., 0., 125., 125.]))
def test_torch_fpgm_pruner(self): model = TorchMnist() configure_list = [{'sparsity': 0.5, 'op_types': ['Conv2d']}] torch_compressor.FPGMPruner(model, configure_list).compress()