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):

Google Fusion Table (predictions)

TL,DR:以较小的学习率和不同的观察顺序对您的数据进行多次循环,您的 partial_fit 的表现将与 fit 一样好。

partial_fit 有很多块的问题是,当您的模型完成最后一个块时,它可能会忘记第一个块。这意味着,由于早期批次导致的模型权重变化将被晚期批次完全覆盖。

然而,这个问题可以通过以下组合轻松解决:

  1. 低学习率。如果模型学习缓慢,那么它也会慢慢遗忘,并且早期的批次不会被晚期批次覆盖。 MLPClassifier 中的默认学习率是 0.001,但您可以将其更改为 3 或 10 的倍数,看看会发生什么。
  2. 多个纪元。如果学习率很慢,那么对所有训练样本进行一次循环可能不足以让模型收敛。所以你可以对训练数据进行多次循环,结果很可能会有所改善。直观的策略是通过降低学习率的相同因子来增加循环次数。
  3. 改组观察结果。如果在你的数据中狗的图像出现在猫的图像之前,那么最终模型会记住更多关于猫的信息而不是关于狗的信息。但是,如果您在批处理生成器中以某种方式打乱您的观察者,那将不是问题。最安全的策略是在每个 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.