Hi Thomas,

it is possible to obtain the activation values of any hidden layer, but the
procedure is not completely straight forward. If you look at the code of
the `_predict` method of MLPs you can see the following:

```python
    def _predict(self, X):
        """Predict using the trained model

        Parameters
        ----------
        X : {array-like, sparse matrix}, shape (n_samples, n_features)
            The input data.

        Returns
        -------
        y_pred : array-like, shape (n_samples,) or (n_samples, n_outputs)
            The decision function of the samples for each class in the
model.
        """
        X = check_array(X, accept_sparse=['csr', 'csc', 'coo'])

        # Make sure self.hidden_layer_sizes is a list
        hidden_layer_sizes = self.hidden_layer_sizes
        if not hasattr(hidden_layer_sizes, "__iter__"):
            hidden_layer_sizes = [hidden_layer_sizes]
        hidden_layer_sizes = list(hidden_layer_sizes)

        layer_units = [X.shape[1]] + hidden_layer_sizes + \
            [self.n_outputs_]

        # Initialize layers
        activations = [X]

        for i in range(self.n_layers_ - 1):
            activations.append(np.empty((X.shape[0],
                                         layer_units[i + 1])))
        # forward propagate
        self._forward_pass(activations)
        y_pred = activations[-1]

        return y_pred
```

the line `y_pred = activations[-1]` is responsible for extracting the
values for the last layer,
but the `activations` variable contains the values for all the neurons.

You can make this function into your own external method (changing the
`self` attribute by
a proper parameter) and add an extra argument which specifies the layer(s)
that you want.
I have done this myself in order to make an AutoEncoderNetwork out of the
MLP
implementation.

This makes me wonder, would it be worth adding this to sklearn?
A very simple way would be to refactor the `_predict` method, with the
additional layer
argument, to a new method `_predict_layer`, then we can have the `_predict`
method
simply call `_predict_layer(..., layer=-1)` and add a new method (perhaps a
`transform`?)
that allows to get (raveled) values for an arbitrary subset of the layers.

I'd be happy to submit a PR if you guys think it would be interesting for
the project.

Javier



On Thu, Dec 7, 2017 at 12:51 AM Thomas Evangelidis <teva...@gmail.com>
wrote:

> Greetings,
>
> I want to train a MLPClassifier with one hidden layer and use it as a
> feature selector for an MLPRegressor.
> Is it possible to get the values of the neurons from the last hidden layer
> of the MLPClassifier to pass them as input to the MLPRegressor?
>
> If it is not possible with scikit-learn, is anyone aware of any
> scikit-compatible NN library that offers this functionality? For example
> this one:
>
> http://scikit-neuralnetwork.readthedocs.io/en/latest/index.html
>
> I wouldn't like to do this in Tensorflow because the MLP there is much
> slower than scikit-learn's implementation.
>
_______________________________________________
scikit-learn mailing list
scikit-learn@python.org
https://mail.python.org/mailman/listinfo/scikit-learn

Reply via email to