神经网络学习行为分析

神经网络的学习行为可以通过分析其权重矩阵来洞察。例如,如果权重看起来无序,可能是因为某些权重根本没有被使用,或者如果存在非常大的系数,可能是因为正则化设置过低或者学习率设置过高。本文将展示如何绘制一个在MNIST数据集上训练的多层感知器(MLP)分类器的首层权重。输入数据由28x28像素的手写数字组成,导致数据集中有784个特征。因此,首层权重矩阵的形状为(784, hidden_layer_sizes[0])。可以将权重矩阵的单列可视化为一个28x28像素的图像。

为了加快示例的运行速度,使用非常少的隐藏单元,并且只训练很短的时间。如果训练时间更长,权重将具有更加平滑的空间外观。由于资源使用限制,该示例将抛出一个警告,因为希望在构建文档的持续集成基础设施上定期构建文档。

以下是迭代过程中的损失值记录:

  • 迭代 1,损失 = 0.44139186
  • 迭代 2,损失 = 0.19174891
  • 迭代 3,损失 = 0.13983521
  • 迭代 4,损失 = 0.11378556
  • 迭代 5,损失 = 0.09443967
  • 迭代 6,损失 = 0.07846529
  • 迭代 7,损失 = 0.06506307
  • 迭代 8,损失 = 0.05534985

训练集得分: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秒)

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