docs: def _bottleneck_block_v1(inputs, filters, training, projection_shortcut,
                           strides, data_format):
    """A single block for ResNet v1, with a bottleneck.
  
    Similar to _building_block_v1(), except using the "bottleneck" blocks
    described in:
      Convolution then batch normalization then ReLU as described by:
        Deep Residual Learning for Image Recognition
        https://arxiv.org/pdf/1512.03385.pdf
        by Kaiming He, Xiangyu Zhang, Shaoqing Ren, and Jian Sun, Dec 2015.
  
    Args:
      inputs: A tensor of size [batch, channels, height_in, width_in] or
        [batch, height_in, width_in, channels] depending on data_format.
      filters: The number of filters for the convolutions.
      training: A Boolean for whether the model is in training or inference
        mode. Needed for batch normalization.
      projection_shortcut: The function to use for projection shortcuts
        (typically a 1x1 convolution when downsampling the input).
      strides: The block's stride. If greater than 1, this block will ultimately
        downsample the input.
      data_format: The input format ('channels_last' or 'channels_first').
  
    Returns:
      The output tensor of the block; shape should match inputs.
    """
    resnet_log_helper.log_begin_block(
        input_tensor=inputs, block_type=mlperf_log.BOTTLENECK_BLOCK)
  
    shortcut = inputs
  
    if projection_shortcut is not None:
      shortcut = projection_shortcut(inputs)
      resnet_log_helper.log_projection(input_tensor=inputs,
                                       output_tensor=shortcut)
      shortcut = batch_norm(inputs=shortcut, training=training,
                            data_format=data_format)
  
    inputs = conv2d_fixed_padding(
        inputs=inputs, filters=filters, kernel_size=1, strides=1,
        data_format=data_format)
    inputs = batch_norm(inputs, training, data_format)
  
    mlperf_log.resnet_print(key=mlperf_log.MODEL_HP_RELU)
    inputs = tf.nn.relu(inputs)
  
    inputs = conv2d_fixed_padding(
        inputs=inputs, filters=filters, kernel_size=3, strides=strides,
        data_format=data_format)
    inputs = batch_norm(inputs, training, data_format)
  
    mlperf_log.resnet_print(key=mlperf_log.MODEL_HP_RELU)
    inputs = tf.nn.relu(inputs)
  
    inputs = conv2d_fixed_padding(
        inputs=inputs, filters=4 * filters, kernel_size=1, strides=1,
        data_format=data_format)
    inputs = batch_norm(inputs, training, data_format)
  
    mlperf_log.resnet_print(key=mlperf_log.MODEL_HP_SHORTCUT_ADD)
    inputs += shortcut
  
    mlperf_log.resnet_print(key=mlperf_log.MODEL_HP_RELU)
    inputs = tf.nn.relu(inputs)
  
    resnet_log_helper.log_end_block(output_tensor=inputs)
    return inputs