partial_fit() 的 MLP 在监督分类中的表现比 fit() 差
MLP with partial_fit() performing worse than with fit() in a supervised classification
我使用的学习数据集是一个灰度图像,flatten
每个像素代表一个单独的样本。在前一张图像上训练 Multilayer perceptron
(MLP
) 分类器后,第二张图像将逐像素分类。
我遇到的问题是 MLP
在一次接收所有训练数据集 (fit()
) 时比按块训练时 (partial_fit()
) 表现更好).在这两种情况下,我都保留 Scikit-learn
提供的默认参数。
我问这个问题是因为当训练数据集是数百万样本时,我将不得不使用partial_fit()
来按块训练MLP
。
def batcherator(data, target, chunksize):
for i in range(0, len(data), chunksize):
yield data[i:i+chunksize], target[i:i+chunksize]
def classify():
classifier = MLPClassifier(verbose=True)
# classifier.fit(training_data, training_target)
gen = batcherator(training.data, training.target, 1000)
for chunk_data, chunk_target in gen:
classifier.partial_fit(chunk_data, chunk_target,
classes=np.array([0, 1]))
predictions = classifier.predict(test_data)
我的问题是我应该在 MLP
分类器中调整哪些参数以使其结果更容易接受 table 当它被数据块训练时?
我尝试使用 hidden_layer_sizes
来增加隐藏层中的神经元数量,但我没有看到任何改进。如果我使用 activation
参数将隐藏层的激活函数从默认的 relu
更改为 logistic
,也没有任何改善。
下面是我正在处理的图像(所有图像都是 512x512
图像),其中 link 到 Google Fusion
table 它们导出为CSV
来自 numpy
数组(将图像保留为 float 而不是 int):
Training_data:
白色区域被屏蔽掉了:Google Fusion Table (training_data)
Class0:
第 1 类:
Training_target:
Google Fusion Table (training_target)
Test_data:
Google Fusion Table (test_data)
预测(含partial_fit):
TL,DR:以较小的学习率和不同的观察顺序对您的数据进行多次循环,您的 partial_fit
的表现将与 fit
一样好。
partial_fit
有很多块的问题是,当您的模型完成最后一个块时,它可能会忘记第一个块。这意味着,由于早期批次导致的模型权重变化将被晚期批次完全覆盖。
然而,这个问题可以通过以下组合轻松解决:
- 低学习率。如果模型学习缓慢,那么它也会慢慢遗忘,并且早期的批次不会被晚期批次覆盖。
MLPClassifier
中的默认学习率是 0.001,但您可以将其更改为 3 或 10 的倍数,看看会发生什么。
- 多个纪元。如果学习率很慢,那么对所有训练样本进行一次循环可能不足以让模型收敛。所以你可以对训练数据进行多次循环,结果很可能会有所改善。直观的策略是通过降低学习率的相同因子来增加循环次数。
- 改组观察结果。如果在你的数据中狗的图像出现在猫的图像之前,那么最终模型会记住更多关于猫的信息而不是关于狗的信息。但是,如果您在批处理生成器中以某种方式打乱您的观察者,那将不是问题。最安全的策略是在每个 epoch 之前重新洗牌数据。
您可以使用 sklearn
提供的 adaptive
学习率功能,而不是手动提供速率。
model = SGDClassifier(loss="hinge", penalty="l2", alpha=0.0001, max_iter=3000, tol=None, shuffle=True, verbose=0, learning_rate='adaptive', eta0=0.01, early_stopping=False)
这在 [scikit 文档] 中描述为:
‘adaptive’: eta = eta0, as long as the training keeps decreasing. Each time n_iter_no_change consecutive epochs fail to decrease the training loss by tol or fail to increase validation score by tol if early_stopping is True, the current learning rate is divided by 5.
我使用的学习数据集是一个灰度图像,flatten
每个像素代表一个单独的样本。在前一张图像上训练 Multilayer perceptron
(MLP
) 分类器后,第二张图像将逐像素分类。
我遇到的问题是 MLP
在一次接收所有训练数据集 (fit()
) 时比按块训练时 (partial_fit()
) 表现更好).在这两种情况下,我都保留 Scikit-learn
提供的默认参数。
我问这个问题是因为当训练数据集是数百万样本时,我将不得不使用partial_fit()
来按块训练MLP
。
def batcherator(data, target, chunksize):
for i in range(0, len(data), chunksize):
yield data[i:i+chunksize], target[i:i+chunksize]
def classify():
classifier = MLPClassifier(verbose=True)
# classifier.fit(training_data, training_target)
gen = batcherator(training.data, training.target, 1000)
for chunk_data, chunk_target in gen:
classifier.partial_fit(chunk_data, chunk_target,
classes=np.array([0, 1]))
predictions = classifier.predict(test_data)
我的问题是我应该在 MLP
分类器中调整哪些参数以使其结果更容易接受 table 当它被数据块训练时?
我尝试使用 hidden_layer_sizes
来增加隐藏层中的神经元数量,但我没有看到任何改进。如果我使用 activation
参数将隐藏层的激活函数从默认的 relu
更改为 logistic
,也没有任何改善。
下面是我正在处理的图像(所有图像都是 512x512
图像),其中 link 到 Google Fusion
table 它们导出为CSV
来自 numpy
数组(将图像保留为 float 而不是 int):
Training_data:
白色区域被屏蔽掉了:Google Fusion Table (training_data)
Class0:
第 1 类:
Training_target:
Google Fusion Table (training_target)
Test_data:
Google Fusion Table (test_data)
预测(含partial_fit):
TL,DR:以较小的学习率和不同的观察顺序对您的数据进行多次循环,您的 partial_fit
的表现将与 fit
一样好。
partial_fit
有很多块的问题是,当您的模型完成最后一个块时,它可能会忘记第一个块。这意味着,由于早期批次导致的模型权重变化将被晚期批次完全覆盖。
然而,这个问题可以通过以下组合轻松解决:
- 低学习率。如果模型学习缓慢,那么它也会慢慢遗忘,并且早期的批次不会被晚期批次覆盖。
MLPClassifier
中的默认学习率是 0.001,但您可以将其更改为 3 或 10 的倍数,看看会发生什么。 - 多个纪元。如果学习率很慢,那么对所有训练样本进行一次循环可能不足以让模型收敛。所以你可以对训练数据进行多次循环,结果很可能会有所改善。直观的策略是通过降低学习率的相同因子来增加循环次数。
- 改组观察结果。如果在你的数据中狗的图像出现在猫的图像之前,那么最终模型会记住更多关于猫的信息而不是关于狗的信息。但是,如果您在批处理生成器中以某种方式打乱您的观察者,那将不是问题。最安全的策略是在每个 epoch 之前重新洗牌数据。
您可以使用 sklearn
提供的 adaptive
学习率功能,而不是手动提供速率。
model = SGDClassifier(loss="hinge", penalty="l2", alpha=0.0001, max_iter=3000, tol=None, shuffle=True, verbose=0, learning_rate='adaptive', eta0=0.01, early_stopping=False)
这在 [scikit 文档] 中描述为:
‘adaptive’: eta = eta0, as long as the training keeps decreasing. Each time n_iter_no_change consecutive epochs fail to decrease the training loss by tol or fail to increase validation score by tol if early_stopping is True, the current learning rate is divided by 5.