在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秒)。