神经网络权重可视化

机器学习中,观察神经网络学习到的权重系数有时可以提供对学习行为的洞察。例如,如果权重看起来没有结构,可能意味着一些权重根本没有被使用;如果存在非常大的系数,可能意味着正则化不够或者学习率太高。本文展示了如何在训练在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数据集上学习到的权重。这些权重可以帮助理解模型是如何识别手写数字的。例如,可以看到某些权重可能对应于数字的特定特征,如线条或曲线。通过分析这些权重,可以更好地理解模型的工作原理,并可能发现一些改进模型性能的方法。

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485