34 downsample=None):
35 """ Constructor
36 Args:
37 inplanes: input channel dimensionality
38 planes: output channel dimensionality
39 baseWidth: base width.
40 cardinality: num of convolution groups.
41 stride: conv stride. Replaces pooling layer.
42 """
43 super(Bottleneck, self).__init__()
44
45 D = int(math.floor(planes * (baseWidth / 64)))
46 C = cardinality
47 self.conv1 = nn.Conv2d(inplanes, D * C, kernel_size=1, stride=1, padding=0, bias=False)
48 if with_ibn:
49 self.bn1 = IBN(D * C, bn_norm)
50 else:
51 self.bn1 = get_norm(bn_norm, D * C)
52 self.conv2 = nn.Conv2d(D * C, D * C, kernel_size=3, stride=stride, padding=1, groups=C, bias=False)
53 self.bn2 = get_norm(bn_norm, D * C)
54 self.conv3 = nn.Conv2d(D * C, planes * 4, kernel_size=1, stride=1, padding=0, bias=False)
55 self.bn3 = get_norm(bn_norm, planes * 4)
56 self.relu = nn.ReLU(inplace=True)
57
58 self.downsample = downsample
59