Visualización de las ponderaciones del MLP en MNIST

A veces, observar los coeficientes aprendidos de una red neuronal puede proporcionar información sobre el comportamiento del aprendizaje. Por ejemplo, si las ponderaciones parecen desestructuradas, puede que algunos no se hayan utilizado, o si existen coeficientes muy grandes, puede que la regularización haya sido demasiado baja o la tasa de aprendizaje demasiado alta.

Este ejemplo muestra cómo trazar algunas de las ponderaciones de la primera capa en un MLPClassifier entrenado en el conjunto de datos MNIST.

Los datos de entrada están compuestos por dígitos manuscritos de 28x28 píxeles, lo que da lugar a 784 características en el conjunto de datos. Por lo tanto, la matriz de ponderaciones de la primera capa tiene la forma (784, hidden_layer_sizes[0]). Por lo tanto, podemos visualizar una sola columna de la matriz de ponderaciones como una imagen de 28x28 píxeles.

Para que el ejemplo funcione más rápido, utilizamos muy pocas unidades ocultas y entrenamos sólo durante un tiempo muy corto. Entrenar más tiempo daría como resultado ponderaciones con una apariencia espacial mucho más suave. El ejemplo emitirá una advertencia porque no converge, en este caso esto es lo que queremos debido a las limitaciones de tiempo de CI.

plot mnist filters

Out:

Iteration 1, loss = 0.32009978
Iteration 2, loss = 0.15347534
Iteration 3, loss = 0.11544755
Iteration 4, loss = 0.09279764
Iteration 5, loss = 0.07889367
Iteration 6, loss = 0.07170497
Iteration 7, loss = 0.06282111
Iteration 8, loss = 0.05530788
Iteration 9, loss = 0.04960484
Iteration 10, loss = 0.04645355
Training set score: 0.986800
Test set score: 0.970000

import warnings

import matplotlib.pyplot as plt
from sklearn.datasets import fetch_openml
from sklearn.exceptions import ConvergenceWarning
from sklearn.neural_network import MLPClassifier

print(__doc__)

# Load data from https://www.openml.org/d/554
X, y = fetch_openml('mnist_784', version=1, return_X_y=True)
X = X / 255.

# rescale the data, use the traditional train/test split
X_train, X_test = X[:60000], X[60000:]
y_train, y_test = y[:60000], y[60000:]

mlp = MLPClassifier(hidden_layer_sizes=(50,), max_iter=10, alpha=1e-4,
                    solver='sgd', verbose=10, random_state=1,
                    learning_rate_init=.1)

# this example won't converge because of CI's time constraints, so we catch the
# warning and are ignore it here
with warnings.catch_warnings():
    warnings.filterwarnings("ignore", category=ConvergenceWarning,
                            module="sklearn")
    mlp.fit(X_train, y_train)

print("Training set score: %f" % mlp.score(X_train, y_train))
print("Test set score: %f" % mlp.score(X_test, y_test))

fig, axes = plt.subplots(4, 4)
# use global min / max to ensure all weights are shown on the same scale
vmin, vmax = mlp.coefs_[0].min(), mlp.coefs_[0].max()
for coef, ax in zip(mlp.coefs_[0].T, axes.ravel()):
    ax.matshow(coef.reshape(28, 28), cmap=plt.cm.gray, vmin=.5 * vmin,
               vmax=.5 * vmax)
    ax.set_xticks(())
    ax.set_yticks(())

plt.show()

Tiempo total de ejecución del script: (0 minutos 54.541 segundos)

Galería generada por Sphinx-Gallery