【问题标题】:Why scikit-learn mlp training takes too much time?为什么 scikit-learn mlp 训练需要太多时间?
【发布时间】:2020-08-08 09:56:27
【问题描述】:

我正在尝试使用 scikit-learn 的 MLPClassifier 训练 MLP。

from sklearn.neural_network import MLPClassifier

我正在用 5400 次迭代训练 mlp,但这大约需要 40 分钟。我做错了什么? 这是创建的 mlp:

mlp= MLPClassifier(hidden_layer_sizes=(128),activation='relu',solver='adam',batch_size=500,shuffle=False,verbose=True)

这是我的代码的训练部分:

for j in range (5400):
    mlp.partial_fit(train_X, y_train,classes=np.unique(y_train))#1 step

train_X 维度为 (27000,784),即 27000 个样本,每个样本为 28*28=784 像素。

我的处理器是 Intel i7-9750H RAM 大小是 16GB。

【问题讨论】:

  • 检查是否使用了多个CPU内核,使用fit并更改max_iter属性,也许您不需要那么多交互。如果您担心速度,请使用 GPU 加速库。

标签: python machine-learning scikit-learn neural-network mlp


【解决方案1】:

您不会训练它进行 5400 次迭代,但可能会进行多达 100 万次迭代;这不是这样做的方法。

检查docs,您会看到MLPClassifier 已经有一个参数max_iter,默认值为200(这是您的案例中使用的值,因为您没有指定任何不同的值):

ma​​x_iter:int,默认=200

最大迭代次数。求解器迭代直到收敛(由“tol”确定)或迭代次数。对于随机求解器(‘sgd’、‘adam’),请注意这决定了 epoch 的数量(每个数据点将被使用多少次),而不是梯度步数。

因此,如果您的 5400 次迭代中的每一次都耗尽了 200 次 max_iter,那么您实际上是在进行 5400x200 ~= 1,000,000 次迭代(epochs)。

不清楚你为什么选择使用for 循环和partial_fit;您可能想要使用完整的fitmax_iter=5400 并且没有循环,或者保留现有循环+ partial_fit 并将MLPClassifier 的定义更改为max_iter=1

在您所展示的内容中,我看不出循环方法的任何原因;如果您的数据不适合内存并且您每次迭代都使用它来提供数据的不同切片,那将是合理的,但它没有任何意义。

【讨论】:

  • 我将 max_iter 更改为 1 但它是一样的。我正在使用 partial_fit 来观察 MLP 行为。
  • @fierywasabi 尝试fit 没有循环;它(显着)更快吗?
  • 尝试不使用循环拟合,处理时间完全相同。此外,python 使用 64% 的 CPU 表示任务管理器,并且在此操作中所有内核都以 4.1GHz 运行。
  • 更新:在 1500 次迭代后,迭代之间的时间变长了,CPU 使用率上升了 98%。我真的不知道我哪里做错了。
猜你喜欢
  • 1970-01-01
  • 2014-09-17
  • 2021-07-26
  • 2013-10-31
  • 2016-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-22
相关资源
最近更新 更多