code: def __init__(
      self,
      in_channels,
      out_channels,
      stride,
      sk_ratio=0,
      use_projection=False,
  ):
      super().__init__()
      if use_projection:
          self.projection = Projection(
              in_channels, out_channels * 4, stride, sk_ratio
          )
      else:
          self.projection = nn.Identity()
      ops = [
          conv(in_channels, out_channels, kernel_size=1),
          BatchNormRelu(out_channels),
      ]
      if sk_ratio > 0:
          ops.append(
              SelectiveKernel(
                  out_channels, out_channels, stride, sk_ratio
              )
          )
      else:
          ops.append(conv(out_channels, out_channels, stride=stride))
          ops.append(BatchNormRelu(out_channels))
      ops.append(conv(out_channels, out_channels * 4, kernel_size=1))
      ops.append(BatchNormRelu(out_channels * 4, relu=False))
      self.net = nn.Sequential(*ops)
  
imports: import logging
  from enum import Enum
  import torch
  import torch.nn
  import torch.nn.functional
  from vissl.config import AttrDict
  from vissl.models.trunks import register_model_trunk
label_desc: Use image node_id 1 to create a new BottleneckBlock object from inherited base classes: nn with example: obj = BottleneckBlock(in_channels, out_channels, stride, sk_ratio, use_projection)