class_docstr: 注意：原论文中，在虚线残差结构的主分支上，第一个1x1卷积层的步距是2，第二个3x3卷积层步距是1。
  但在pytorch官方实现过程中是第一个1x1卷积层的步距是1，第二个3x3卷积层步距是2，
  这么做的好处是能够在top1上提升大概0.5%的准确率。
  可参考Resnet v1.5 https://ngc.nvidia.com/catalog/model-scripts/nvidia:resnet_50_v1_5_for_pytorch
code: def __init__(self, out_channel, strides=1, downsample=None, **kwargs):
      super(Bottleneck, self).__init__(**kwargs)
      self.conv1 = layers.Conv2D(
          out_channel, kernel_size=1, use_bias=False, name="conv1"
      )
      self.bn1 = layers.BatchNormalization(
          momentum=0.9, epsilon=1e-5, name="conv1/BatchNorm"
      )
      # -----------------------------------------
      self.conv2 = layers.Conv2D(
          out_channel,
          kernel_size=3,
          use_bias=False,
          strides=strides,
          padding="SAME",
          name="conv2",
      )
      self.bn2 = layers.BatchNormalization(
          momentum=0.9, epsilon=1e-5, name="conv2/BatchNorm"
      )
      # -----------------------------------------
      self.conv3 = layers.Conv2D(
          out_channel * self.expansion,
          kernel_size=1,
          use_bias=False,
          name="conv3",
      )
      self.bn3 = layers.BatchNormalization(
          momentum=0.9, epsilon=1e-5, name="conv3/BatchNorm"
      )
      # -----------------------------------------
      self.relu = layers.ReLU()
      self.downsample = downsample
      self.add = layers.Add()
  
file_path: deep-learning-for-image-processing/tensorflow_classification/Test5_resnet/model.py
imports: from tensorflow.keras import layers, Model, Sequential
label_desc: Use image node_id 1 to create a new Bottleneck object from inherited base classes: layers with example: obj = Bottleneck(out_channel, strides, downsample)