我正在尝试sklearns编写有关MNIST数据集上的neutral_work训练的文章。 为什么优化器没有收敛?还可以做些什么来提高我得到的准确度?
python
import matplotlib.pyplot as plt
from sklearn.datasets import fetch_openml
from sklearn.neural_network import MLPClassifier
print(__doc__)
# load data from http://www.openml.org/d/d554
X, y = fetch_openml('mnist_784', version=1, return_X_y=True)
X = X / 255.
# rescale the data. use the traditional train/test split
X_train, X_test = X[:60000], X[60000:]
y_train, y_test = y[:60000], y[60000:]
# mlp = MLPClassifier(hidden_layer_sizes=(100, 100), max_iter=400, alpha=1e-4,
# solver='sgd' , verbose=10, tol=14-4, random_state=1)
mlp = MLPClassifier(hidden_layer_sizes=(50,), max_iter=10, alpha=1e-4,
solver='sgd', verbose=10, tol=1e-4, random_state=1,
learning_rate_init=.1)
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)
# use global min/max to ensure all weights are shown on the same scale
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=.5 * vmin,
vmax=.5 * vmax)
ax.set_xticks(())
ax.set_yticks(())
plt.show()
答案 0 :(得分:1)
“ ConvergenceWarning:随机优化器:已达到最大迭代次数(10),并且优化尚未收敛。ConvergenceWarning)”
收敛点是机器学习模型的局部最优状态。这基本上意味着模型中的变量具有最佳的可能值(在一定范围内),以便基于另一组特征预测目标特征。在多层感知器(MLP)中,这些变量是每个神经元内的权重。通常,当数据集不代表有组织且可辨别的模式时,机器学习算法可能无法找到收敛点。但是,如果有一个收敛点,则机器学习模型将尽力找到它。为了训练MLP,您需要多次迭代网络中的数据集,以使其权重找到收敛点。您还可以限制迭代次数以限制处理时间或作为正则化工具。在您的代码示例中,您有2个MLP模型,但是我将重点关注未注释的代码段:
mlp = MLPClassifier(hidden_layer_sizes=(50,), max_iter=10, alpha=1e-4,solver='sgd', verbose=10, tol=1e-4, random_state=1,learning_rate_init=.1)
有几个参数可能会影响模型收敛所需的迭代次数,但是,您可以做的最简单的更改就是增加最大迭代次数,例如将其设置为100 max_iter=100
。
但是,此机器学习模型可能存在更致命的问题。 MNIST数据集是一组手写字符图像。 MLP是一种高度灵活的机器学习模型,但是,它可能不是用于计算机视觉和图像分类的适当模型。使用MLP可能会获得一些积极的结果,使用卷积神经网络可能会获得更好的结果,而卷积神经网络基本上是真正的MLP。