在机器学习中,观察神经网络学习到的权重系数有时可以提供对学习行为的洞察。例如,如果权重看起来没有结构,可能意味着一些权重根本没有被使用;如果存在非常大的系数,可能意味着正则化不够或者学习率太高。本文展示了如何在训练在MNIST数据集上的MLPClassifier的一层权重上进行可视化。输入数据由28x28像素的手写数字组成,导致数据集中有784个特征。因此,第一层权重矩阵的形状为(784, hidden_layer_sizes[0])。可以将权重矩阵的单列可视化为28x28像素的图像。
为了使示例运行得更快,只使用很少的隐藏单元,并且只训练很短的时间。如果训练时间更长,权重将具有更平滑的空间外观。由于持续集成基础设施的资源使用限制,示例将抛出一个警告,因为示例没有收敛,在这种情况下,希望如此,因为定期构建此文档。
以下是训练过程中的损失值和迭代次数的记录:
Iteration 1, loss = 0.44139186
Iteration 2, loss = 0.19174891
Iteration 3, loss = 0.13983521
Iteration 4, loss = 0.11378556
Iteration 5, loss = 0.09443967
Iteration 6, loss = 0.07846529
Iteration 7, loss = 0.06506307
Iteration 8, loss = 0.05534985
训练集得分:0.986429,测试集得分:0.953061。
以下是实现这一可视化的Python代码。首先,需要导入必要的库,并加载MNIST数据集。然后,将数据集分成训练集和测试集,并创建一个MLPClassifier模型。设置了一些参数,如隐藏层大小、最大迭代次数、正则化参数等。然后,训练模型并打印训练集和测试集的得分。最后,使用matplotlib库来可视化第一层权重。
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
# 加载数据
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)
# 创建MLPClassifier模型
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()
这段代码首先导入了必要的库,包括警告、matplotlib.pyplot、sklearn.datasets、sklearn.exceptions、sklearn.model_selection和sklearn.neural_network。然后,从OpenML网站加载了MNIST数据集,并将其归一化。接着,将数据集分成训练集和测试集,并创建了一个MLPClassifier模型。设置了一些参数,如隐藏层大小、最大迭代次数、正则化参数等。然后,训练模型并打印训练集和测试集的得分。最后,使用matplotlib库来可视化第一层权重。
通过这种方式,可以直观地看到神经网络在MNIST数据集上学习到的权重。这些权重可以帮助理解模型是如何识别手写数字的。例如,可以看到某些权重可能对应于数字的特定特征,如线条或曲线。通过分析这些权重,可以更好地理解模型的工作原理,并可能发现一些改进模型性能的方法。