def __init__(self, inplanes, planes, stride=1, dilation=1, downsample=None, conv_cfg=None, norm_cfg=dict(type='BN')): super(BasicBlock, self).__init__() self.norm1_name, norm1 = build_norm_layer(norm_cfg, planes, postfix=1) self.norm2_name, norm2 = build_norm_layer(norm_cfg, planes, postfix=2) self.conv1 = build_conv_layer(conv_cfg, inplanes, planes, 3, stride=stride, padding=dilation, dilation=dilation, bias_attr=False) self.add_sublayer(self.norm1_name, norm1) self.conv2 = build_conv_layer(conv_cfg, planes, planes, 3, padding=1, bias_attr=False) self.add_sublayer(self.norm2_name, norm2) self.relu = fluid.layers.relu self.downsample = downsample self.stride = stride self.dilation = dilation
def __init__(self, inplanes, planes, stride=1, dilation=1, downsample=None, conv_cfg=None, norm_cfg=dict(type='BN')): """Bottleneck block for ResNet. the stride-two layer is the 3x3 conv layer,. """ super(Bottleneck, self).__init__() self.inplanes = inplanes self.planes = planes self.stride = stride self.dilation = dilation self.conv_cfg = conv_cfg self.norm_cfg = norm_cfg self.conv1_stride = 1 self.conv2_stride = stride self.norm1_name, norm1 = build_norm_layer(norm_cfg, planes, postfix=1) self.norm2_name, norm2 = build_norm_layer(norm_cfg, planes, postfix=2) self.norm3_name, norm3 = build_norm_layer(norm_cfg, planes * self.expansion, postfix=3) self.conv1 = build_conv_layer(conv_cfg, inplanes, planes, 1, stride=1, bias_attr=False) self.add_sublayer(self.norm1_name, norm1) self.conv2 = build_conv_layer(conv_cfg, planes, planes, 3, stride=stride, padding=dilation, dilation=dilation, bias_attr=False) self.add_sublayer(self.norm2_name, norm2) self.conv3 = build_conv_layer(conv_cfg, planes, planes * self.expansion, 1, bias_attr=False) self.add_sublayer(self.norm3_name, norm3) self.relu = fluid.layers.relu self.downsample = downsample
def _make_stem_layer(self): self.conv1 = build_conv_layer(self.conv_cfg, 3, 64, 7, stride=2, padding=3, bias_attr=False) _, self.norm1 = build_norm_layer(self.norm_cfg, 64, postfix=1) self.relu = fluid.layers.relu self.maxpool = nn.Pool2D(pool_size=3, pool_stride=2, pool_padding=1) self.conv2 = build_conv_layer(self.conv_cfg, 64, 128, 3, stride=2, padding=1, bias_attr=False) _, self.norm2 = build_norm_layer(self.norm_cfg, 128, postfix=1)
def _make_one_branch(self, branch_index, block, num_blocks, num_channels, stride=1): downsample = None if stride != 1 or \ self.in_channels[branch_index] != \ num_channels[branch_index] * block.expansion: downsample = nn.Sequential( build_conv_layer( self.conv_cfg, self.in_channels[branch_index], num_channels[branch_index] * block.expansion, kernel_size=1, stride=stride, bias=False), build_norm_layer(self.norm_cfg, num_channels[branch_index] * block.expansion)[1]) layers = [] layers.append( block( self.in_channels[branch_index], num_channels[branch_index], stride, downsample=downsample, with_cp=self.with_cp, norm_cfg=self.norm_cfg, conv_cfg=self.conv_cfg)) self.in_channels[branch_index] = \ num_channels[branch_index] * block.expansion for i in range(1, num_blocks[branch_index]): layers.append( block( self.in_channels[branch_index], num_channels[branch_index], with_cp=self.with_cp, norm_cfg=self.norm_cfg, conv_cfg=self.conv_cfg)) return nn.Sequential(*layers)
def make_res_layer(block, inplanes, planes, blocks, stride=1, dilation=1, conv_cfg=None, norm_cfg=dict(type='BN')): downsample = None if stride != 1 or inplanes != planes * block.expansion: downsample = Sequential( build_conv_layer(conv_cfg, inplanes, planes * block.expansion, 1, stride=stride, bias_attr=False), build_norm_layer(norm_cfg, planes * block.expansion)[1]) layers = [] layers.append( block(inplanes, planes, stride, dilation, downsample, conv_cfg=conv_cfg, norm_cfg=norm_cfg)) inplanes = planes * block.expansion for i in range(1, blocks): layers.append( block(inplanes, planes, 1, dilation, conv_cfg=conv_cfg, norm_cfg=norm_cfg)) return Sequential(*layers)
def _make_fuse_layers(self): if self.num_branches == 1: return None num_branches = self.num_branches in_channels = self.in_channels fuse_layers = [] num_out_branches = num_branches if self.multiscale_output else 1 for i in range(num_out_branches): fuse_layer = [] for j in range(num_branches): if j > i: fuse_layer.append( nn.Sequential( build_conv_layer( self.conv_cfg, in_channels[j], in_channels[i], kernel_size=1, stride=1, padding=0, bias=False), build_norm_layer(self.norm_cfg, in_channels[i])[1], nn.Upsample( scale_factor=2**(j - i), mode='nearest'))) elif j == i: fuse_layer.append(None) else: conv_downsamples = [] for k in range(i - j): if k == i - j - 1: conv_downsamples.append( nn.Sequential( build_conv_layer( self.conv_cfg, in_channels[j], in_channels[i], kernel_size=3, stride=2, padding=1, bias=False), build_norm_layer(self.norm_cfg, in_channels[i])[1])) else: conv_downsamples.append( nn.Sequential( build_conv_layer( self.conv_cfg, in_channels[j], in_channels[j], kernel_size=3, stride=2, padding=1, bias=False), build_norm_layer(self.norm_cfg, in_channels[j])[1], nn.ReLU(inplace=False))) fuse_layer.append(nn.Sequential(*conv_downsamples)) fuse_layers.append(nn.ModuleList(fuse_layer)) return nn.ModuleList(fuse_layers)