def initialize_back_prop(AL, Y, AL_prime, Y_prime):
    """
    Initialize backward propagation

    Arguments:
    :param AL -- output of the forward propagation L_model_forward()... i.e. neural net predictions   (if regression)
                                                                 i.e. neural net probabilities (if classification)
          >> a numpy array of shape (n_y, m) where n_y = no. outputs, m = no. examples

    :param Y -- true "label" (classification) or "value" (regression)
         >> a numpy array of shape (n_y, m) where n_y = no. outputs, m = no. examples

    :param AL_prime -- the derivative of the last layer's activation output(s) w.r.t. the inputs x: AL' = d(AL)/dX
                >> a numpy array of size (n_y, n_x, m) where n_y = no. outputs, n_x = no. inputs, m = no. examples

    :param Y_prime -- the true derivative of the output(s) w.r.t. the inputs x: Y' = d(Y)/dX
               >> a numpy array of shape (n_y, n_x, m) where n_y = no. outputs, n_x = no. inputs, m = no. examples

    Returns:
    :return dAL -- gradient of the loss function w.r.t. last layer activations: d(L)/dAL
           >> a numpy array of shape (n_y, m)

    :return dAL_prime -- gradient of the loss function w.r.t. last layer activations derivatives: d(L)/dAL' where AL' = d(AL)/dX
                 >> a numpy array of shape (n_y, n_x, m)
    """
    n_y, _ = AL.shape
    Y = Y.reshape(AL.shape)
    dAL = AL - Y
    dAL_prime = AL_prime - Y_prime
    return dAL, dAL_prime
