在MNIST数据集上可视化MLP权重

有时查看神经网络的学习系数可以洞悉学习行为。例如,如果权重看起来是无结构的,则可能根本没有使用权重,或者如果存在很大的系数,则可能是正则化过低或学习率过高。

此示例显示了如何在MNIST数据集上训练的MLPClassifier中绘制一些第一层权重。

输入数据由28x28像素的手写数字组成,导致数据集中有784个要素。因此,第一层权重矩阵的形状为(784,hidden_layer_sizes [0])。因此,我们可以将权重矩阵的单个列可视化为28x28像素的图像。

为了使示例运行更快,我们使用了很少的隐藏单元,并且只训练了很短的时间。训练时间越长,举重的空间外观就越平滑。该示例将因为未收敛而发出警告,在这种情况下,由于CI的时间限制,这正是我们想要的。

输入:

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__)

# 从页面https://www.openml.org/d/554导入数据
X, y = fetch_openml('mnist_784', version=1, return_X_y=True)
X = X / 255.

# 重新缩放数据,使用传统的训练/测试拆分
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)

# 由于CI的时间限制,此示例无法收敛,因此我们捕获了警告,在这里忽略它
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(44)
# 使用全局最小值/最大值以确保所有权重均以相同的比例显示
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(2828), cmap=plt.cm.gray, vmin=.5 * vmin,
               vmax=.5 * vmax)
    ax.set_xticks(())
    ax.set_yticks(())

plt.show()

输出:

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

脚本的总运行时间:(0分钟38.944秒)。