神经网络的学习行为可以通过分析其权重矩阵来洞察。例如,如果权重看起来无序,可能是因为某些权重根本没有被使用,或者如果存在非常大的系数,可能是因为正则化设置过低或者学习率设置过高。本文将展示如何绘制一个在MNIST数据集上训练的多层感知器(MLP)分类器的首层权重。输入数据由28x28像素的手写数字组成,导致数据集中有784个特征。因此,首层权重矩阵的形状为(784, hidden_layer_sizes[0])。可以将权重矩阵的单列可视化为一个28x28像素的图像。
为了加快示例的运行速度,使用非常少的隐藏单元,并且只训练很短的时间。如果训练时间更长,权重将具有更加平滑的空间外观。由于资源使用限制,该示例将抛出一个警告,因为希望在构建文档的持续集成基础设施上定期构建文档。
以下是迭代过程中的损失值记录:
训练集得分:0.986429,测试集得分:0.953061。
以下是实现上述功能的Python代码示例:
import warnings
import matplotlib.pyplot as plt
from sklearn.datasets import fetch_openml
from sklearn.exceptions import ConvergenceWarning
from sklearn.model_selection import train_test_split
from sklearn.neural_network import MLPClassifier
# 从 https://www.openml.org/d/554 加载数据
X, y = fetch_openml("mnist_784", version=1, return_X_y=True, as_frame=False)
X = X / 255.0 # 归一化数据
# 将数据分割为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=0, test_size=0.7)
# 初始化MLP分类器
mlp = MLPClassifier(hidden_layer_sizes=(40,), max_iter=8, alpha=1e-4, solver="sgd", verbose=10, random_state=1, learning_rate_init=0.2)
# 忽略未收敛的警告
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)
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=0.5 * vmin, vmax=0.5 * vmax)
ax.set_xticks(())
ax.set_yticks(())
plt.show()
脚本的总运行时间为:(0分钟 6.609秒)