#################################################################################### Fully-Connected Neural Nets: a modular approach ######################################################################################################################################################################## Ideally we want to build networks using a modular design so that we ## can implement different layer types in isolation and then snap them ## together into models with different architectures. In this exercise ## we will implement fully-connected networks using a modular ## approach. For each layer we will implement a forward and a backward ## function. The forward function will receive inputs, weights, and other ## parameters and will return both an output and a cache object storing ## data needed for the backward pass. #####