def get_dense_network_shapes(n_layers, hidden_size, n_features, n_outputs):
    """
    Helper function to generate the input/output shapes for the layers of a densely connected network
    :param n_layers: Number of hidden layers in the network
    :param hidden_size: How many hidden neurons to use
    :param n_features: Number of features in the original input
    :param n_outputs: Output size/number of target variables
    :return:
    """
    shapes = {'input': (n_features, hidden_size),
              'hidden': [],
              'output': (hidden_size * (n_layers+1) + n_features, n_outputs)}
    for i in range(n_layers):
        shapes['hidden'].append((hidden_size * (i + 1) + n_features, hidden_size))
    return shapes