class_docstr: Bottleneck transformation: 1x1, 3x3, 1x1, only for very deep networks
class_docstr_tok: ["Bottleneck","transformation",":","1x1",",","3x3",",","1x1",",","only","for","very","deep","networks"]
code: def _construct(self, w_in, w_out, stride, w_b, num_gs):
      # MSRA -> stride=2 is on 1x1; TH/C2 -> stride=2 is on 3x3
      (str1x1, str3x3) = (1, stride)
      # 1x1, BN, ReLU
      self.a = nn.Conv2d(
          w_in,
          w_b,
          kernel_size=1,
          stride=str1x1,
          padding=0,
          bias=not self.has_bn and not self.use_srelu,
      )
      if self.has_bn:
          self.a_bn = nn.BatchNorm2d(w_b)
      self.a_relu = (
          nn.ReLU(inplace=True) if not self.use_srelu else SReLU(w_b)
      )
      # 3x3, BN, ReLU
      self.b = nn.Conv2d(
          w_b,
          w_b,
          kernel_size=3,
          stride=str3x3,
          padding=1,
          groups=num_gs,
          bias=not self.has_bn and not self.use_srelu,
      )
      if self.has_bn:
          self.b_bn = nn.BatchNorm2d(w_b)
      self.b_relu = (
          nn.ReLU(inplace=True) if not self.use_srelu else SReLU(w_b)
      )
      # 1x1, BN
      self.c = nn.Conv2d(
          w_b,
          w_out,
          kernel_size=1,
          stride=1,
          padding=0,
          bias=not self.has_bn and not self.use_srelu,
      )
      if self.has_bn:
          self.c_bn = nn.BatchNorm2d(w_out)
          self.c_bn.final_bn = True
  
imports: import numpy
  import torch
  import torch.nn
  import torch.nn.functional
label_desc: Use image node_id 2 for calling the BottleneckTransform obj's underlying member method code with example usage: obj._construct(w_in, w_out, stride, w_b, num_gs) without return types