def METHOD_NAME(self, input_shape, **kwargs):
    """Construct a network and return its input and output layers.
    Arguments
    ---------
    input_shape : tuple of shape = (series_length (m), n_dimensions (d))
        The shape of the data fed into the input layer.
    Returns
    -------
    input_layer : keras.layers.Input
        The input layer of the network.
    output_layer : keras.layers.Layer
        The output layer of the network.
    """
    from tensorflow import keras
    n_feature_maps = 64
    input_layer = keras.layers.Input(input_shape)
    # 1st residual block
    conv_x = keras.layers.Conv1D(
        filters=n_feature_maps, kernel_size=8, padding="same"
    )(input_layer)
    conv_x = keras.layers.BatchNormalization()(conv_x)
    conv_x = keras.layers.Activation("relu")(conv_x)
    conv_y = keras.layers.Conv1D(
        filters=n_feature_maps, kernel_size=5, padding="same"
    )(conv_x)
    conv_y = keras.layers.BatchNormalization()(conv_y)
    conv_y = keras.layers.Activation("relu")(conv_y)
    conv_z = keras.layers.Conv1D(
        filters=n_feature_maps, kernel_size=3, padding="same"
    )(conv_y)
    conv_z = keras.layers.BatchNormalization()(conv_z)
    # expand channels for the sum
    shortcut_y = keras.layers.Conv1D(
        filters=n_feature_maps, kernel_size=1, padding="same"
    )(input_layer)
    shortcut_y = keras.layers.BatchNormalization()(shortcut_y)
    output_block_1 = keras.layers.add([shortcut_y, conv_z])
    output_block_1 = keras.layers.Activation("relu")(output_block_1)
    # 2nd residual block
    conv_x = keras.layers.Conv1D(
        filters=n_feature_maps * 2, kernel_size=8, padding="same"
    )(output_block_1)
    conv_x = keras.layers.BatchNormalization()(conv_x)
    conv_x = keras.layers.Activation("relu")(conv_x)
    conv_y = keras.layers.Conv1D(
        filters=n_feature_maps * 2, kernel_size=5, padding="same"
    )(conv_x)
    conv_y = keras.layers.BatchNormalization()(conv_y)
    conv_y = keras.layers.Activation("relu")(conv_y)
    conv_z = keras.layers.Conv1D(
        filters=n_feature_maps * 2, kernel_size=3, padding="same"
    )(conv_y)
    conv_z = keras.layers.BatchNormalization()(conv_z)
    # expand channels for the sum
    shortcut_y = keras.layers.Conv1D(
        filters=n_feature_maps * 2, kernel_size=1, padding="same"
    )(output_block_1)
    shortcut_y = keras.layers.BatchNormalization()(shortcut_y)
    output_block_2 = keras.layers.add([shortcut_y, conv_z])
    output_block_2 = keras.layers.Activation("relu")(output_block_2)
    # 3rd residual block
    conv_x = keras.layers.Conv1D(
        filters=n_feature_maps * 2, kernel_size=8, padding="same"
    )(output_block_2)
    conv_x = keras.layers.BatchNormalization()(conv_x)
    conv_x = keras.layers.Activation("relu")(conv_x)
    conv_y = keras.layers.Conv1D(
        filters=n_feature_maps * 2, kernel_size=5, padding="same"
    )(conv_x)
    conv_y = keras.layers.BatchNormalization()(conv_y)
    conv_y = keras.layers.Activation("relu")(conv_y)
    conv_z = keras.layers.Conv1D(
        filters=n_feature_maps * 2, kernel_size=3, padding="same"
    )(conv_y)
    conv_z = keras.layers.BatchNormalization()(conv_z)
    # no need to expand channels because they are equal
    shortcut_y = keras.layers.BatchNormalization()(output_block_2)
    output_block_3 = keras.layers.add([shortcut_y, conv_z])
    output_block_3 = keras.layers.Activation("relu")(output_block_3)
    # global average pooling
    gap_layer = keras.layers.GlobalAveragePooling1D()(output_block_3)
    return input_layer, gap_layer