You mean `cdef` classes `DenseArray` and `CSRMatrix`? I think that's overengineering as there are only two places where the distinction matters: when computing the input->hidden activations, and their gradients. Also, if we do want to get more hidden layers in the future, then each hidden layer will be doing a useless check for sparse input.

In the long run, we might refactor the `SequentialDataset` from `sklearn.utils` to work with this class, but I'm leaving that out of scope as it causes a lot of changes in `SGDClassifier` as well.