Exemplo n.º 1
0
def get_prune_list(resnet_channel_list, prob_list, dcfg, expand_rate=0.0001):
    import numpy as np
    prune_list = []
    idx = 0

    chn_input_full, chn_output_full = 3, resnet_channel_list[0]
    dnas_conv = lambda input, output: DNAS.Conv2d(input, output, 1, 1, 1, False, dcfg=dcfg)
    conv = dnas_conv(chn_input_full, chn_output_full)
    chn_output_prune = int(np.round(
        min(torch.dot(prob_list[idx], conv.out_plane_list).item(), chn_output_full)
    ))
    chn_output_prune += int(np.ceil(expand_rate*(chn_output_full-chn_output_prune)))
    prune_list.append(chn_output_prune)
    chn_input_full = chn_output_full
    idx += 1
    for blocks in resnet_channel_list[1:]:
        blocks_list = []
        for block in blocks:
            block_prune_list = []
            for chn_output_full in block:
                conv = DNAS.Conv2d(chn_input_full, chn_output_full, 1, 1, 1, False, dcfg=dcfg)
                print(prob_list[idx], conv.out_plane_list, torch.dot(prob_list[idx], conv.out_plane_list).item())
                chn_output_prune = int(np.round(
                    min(torch.dot(prob_list[idx], conv.out_plane_list).item(), chn_output_full)
                ))
                chn_output_prune += int(np.ceil(expand_rate*(chn_output_full-chn_output_prune)))
                block_prune_list.append(chn_output_prune)
                chn_input_full = chn_output_full
                idx += 1
            blocks_list.append(block_prune_list)
        prune_list.append(blocks_list)
    return prune_list
Exemplo n.º 2
0
    def __init__(self,
                 in_planes,
                 out_planes_list,
                 stride=2,
                 project=False,
                 dcfg=None):
        super(BottleneckGated, self).__init__()
        out_planes_1 = out_planes_list[0]
        out_planes_2 = out_planes_list[1]
        out_planes_3 = out_planes_list[2]
        assert dcfg is not None
        self.dcfg = dcfg
        self.dcfg_nonreuse = dcfg.copy()

        self.bn0 = nn.BatchNorm2d(in_planes,
                                  momentum=_BATCH_NORM_DECAY,
                                  eps=_EPSILON)
        self.conv1 = DNAS.Conv2d(in_planes,
                                 out_planes_1,
                                 kernel_size=1,
                                 stride=1,
                                 padding=0,
                                 bias=False,
                                 dcfg=self.dcfg_nonreuse)
        self.bn1 = nn.BatchNorm2d(out_planes_1,
                                  momentum=_BATCH_NORM_DECAY,
                                  eps=_EPSILON)
        self.conv2 = DNAS.Conv2d(out_planes_1,
                                 out_planes_2,
                                 kernel_size=3,
                                 stride=stride,
                                 padding=1,
                                 bias=False,
                                 dcfg=self.dcfg_nonreuse)
        self.bn2 = nn.BatchNorm2d(out_planes_2,
                                  momentum=_BATCH_NORM_DECAY,
                                  eps=_EPSILON)
        self.shortcut = None
        # if stride != 1 and len(out_planes_list) > 2:
        if project:
            self.shortcut = DNAS.Conv2d(in_planes,
                                        out_planes_list[-1],
                                        kernel_size=1,
                                        stride=stride,
                                        padding=0,
                                        bias=False,
                                        dcfg=self.dcfg_nonreuse)
            self.dcfg.reuse_gate = self.shortcut.gate
        self.conv3 = DNAS.Conv2d(out_planes_2,
                                 out_planes_3,
                                 kernel_size=1,
                                 stride=1,
                                 padding=0,
                                 bias=False,
                                 dcfg=self.dcfg)
Exemplo n.º 3
0
 def __init__(self,
              num_blocks,
              num_planes,
              num_colors=3,
              scale=1,
              res_scale=0.1):
     super(EDSRGated, self).__init__()
     self.num_blocks = num_blocks
     self.act = nn.ReLU(inplace=True)
     self.sub_mean = MeanShift(1)
     self.add_mean = MeanShift(1, sign=1)
     self.conv0 = dnas.Conv2d(num_colors,
                              num_planes,
                              3,
                              stride=1,
                              padding=1,
                              bias=False,
                              dcfg=self.dcfg)
     self.dcfg.reuse_gate = self.conv0.gate
     self.blocks = list()
     for _ in range(num_blocks):
         self.blocks.append(EDSRBlockGated(num_planes, res_scale,
                                           self.dcfg))
     m_tail = list()
     m_tail.append(Upsampler(scale, num_planes))
     m_tail.append(
         nn.Conv2d(in_channels=num_planes,
                   out_channels=num_colors,
                   kernel_size=3,
                   stride=1,
                   padding=1,
                   bias=False))
     self.tail = nn.Sequential(*m_tail)
Exemplo n.º 4
0
    def __init__(self, n_layer, n_class, channel_lists, dcfg):
        super(ResNet, self).__init__()

        if n_layer not in cfg.keys():
            print('Numer of layers Error: ', n_layer)
            exit(1)
        self.n_class = n_class
        self.channel_lists = channel_lists
        self.block_n_cell = cfg[n_layer]
        self.dcfg = dcfg
        self.base_n_channel = channel_lists[0]
        self.imagenet = len(self.block_n_cell) > 3

        if self.imagenet:
            self.cell_fn = BottleneckGated if n_layer >= 50 else ResidualBlockGated
            self.conv0 = DNAS.Conv2d(3,
                                     self.base_n_channel,
                                     7,
                                     stride=2,
                                     padding=3,
                                     bias=False,
                                     dcfg=self.dcfg)
            self.maxpool = nn.MaxPool2d(kernel_size=3, stride=2, padding=1)
        else:
            self.cell_fn = ResidualBlockGated
            self.conv0 = DNAS.Conv2d(3,
                                     self.base_n_channel,
                                     3,
                                     stride=1,
                                     padding=1,
                                     bias=False,
                                     dcfg=self.dcfg)
        self.dcfg.reuse_gate = self.conv0.gate

        self.block_list = self._block_layers()
        self.bn = nn.BatchNorm2d(channel_lists[-1][-1][-1],
                                 momentum=_BATCH_NORM_DECAY,
                                 eps=_EPSILON)
        self.avgpool = nn.AdaptiveAvgPool2d((1, 1))
        self.fc = DNAS.Linear(channel_lists[-1][-1][-1],
                              self.n_class,
                              dcfg=self.dcfg)
        self.apply(_weights_init)
Exemplo n.º 5
0
 def __init__(self, num_planes, res_scale=1, dcfg=None):
     super(EDSRBlockGated, self).__init__()
     assert dcfg is not None
     self.dcfg = dcfg
     self.dcfg_nonreuse = dcfg.copy()
     self.conv1 = dnas.Conv2d(num_planes,
                              num_planes,
                              kernel_size=3,
                              stride=1,
                              padding=1,
                              bias=False,
                              dcfg=self.dcfg_nonreuse)
     self.act = nn.ReLU(inplace=True)
     self.conv2 = dnas.Conv2d(num_planes,
                              num_planes,
                              kernel_size=3,
                              stride=1,
                              padding=1,
                              bias=False,
                              dcfg=self.dcfg)
     self.res_scale = res_scale