The ModelFeatures provides a common way of defining the layout of a model. This is
used to define the number of input features, the number of hidden layers, the number of
hidden features, and the number of output features.
In contrast to the ModelFeatures type, the ModelLayout implementation aims to
provide a generic foundation for using type-based features / layouts within neural network.
Our goal with this struct is to eventually push the implementation to the point of being
able to sufficiently describe everything about a model’s layout (similar to what the
ndarray developers have attained with the LayoutRef).
The ModelFormat type enumerates the various formats a neural network may take, either
shallow or deep, providing a unified interface for accessing the number of hidden features
and layers in the model. This is primarily used to generalize the allowed formats of a
neural network without introducing any additional complexity with typing or other
constructs.