【问题标题】:Training on multiple data sets with scikit.mlpregressor使用 scikit.mlpregressor 训练多个数据集
【发布时间】:2021-07-22 19:08:49
【问题描述】:

我目前正在一个更大的数据集上训练我的第一个神经网络。我已将我的训练数据拆分为几个 .npy 二进制文件,每个文件都包含 20k 个训练样本的批次。我正在从 npy 文件中加载数据,应用一些简单的预处理操作,然后在循环中多次应用 partial_fit 方法开始训练我的网络:

for i in range(50):
    nnmodel.partial_fit(X_tr,Y_tr)

我已经读过,常规的 .fit() 方法不能训练多批次,但 partial_fit 相反应该能够做到。我的第一次训练运行总是很好。损失正在减少,我得到了很好的拟合结果,所以我使用joblib.dump 方法保存了我的模型。 对于下一次调用,我再次使用完全相同的脚本,从 .npy 文件中加载我的数据(无论我提供相同批次还是另一个批次都无关紧要),预处理它,这次加载我的 pre使用joblib.load 训练模型,然后再次开始执行partial_fit 循环。 我在第二次运行中总是得到的是所有迭代的持续损失,无论我使用什么数据集,错误都不再减少:

Iteration 51, loss = 3.93268978
Iteration 52, loss = 3.93268978
Iteration 53, loss = 3.93268978
Iteration 54, loss = 3.93268978 ...

我在这里做错了什么? 已经谢谢了!

【问题讨论】:

    标签: python machine-learning scikit-learn


    【解决方案1】:

    有几种可能。

    1. 模型可能已经收敛
    2. 可能没有足够的批次通过次数(在下面的示例中,模型直到约 500 次迭代才会收敛)
    3. (需要更多信息)joblib.dumpjoblib.load 可能以意外的方式保存或加载

    与其多次调用脚本并在迭代之间转储结果,如果初始化/预处理/训练/可视化都发生在一个脚本中,调试可能会更容易。这是一个最小的例子:

    import matplotlib.pyplot as plt
    from sklearn.neural_network import MLPRegressor
    from sklearn.datasets import make_regression
    from sklearn.model_selection import train_test_split
    
    X, y = make_regression(n_samples=10000, random_state=42)
    X_train, X_test, y_train, y_test = train_test_split(X, y)
    
    regr = MLPRegressor()
    
    losses = []
    test_performance = []
    
    for _ in range(100):
        # Make 100 passes over the batches
    
        for batch in range(500, 7501, 500):
            # Perform partial fits on batches of 500 examples
    
            # Simulate batches, these could also be loaded from `.npy`
            X_train_batch = X_train[batch-500:batch]
            y_train_batch = y_train[batch-500:batch]
    
            regr.partial_fit(X_train_batch, y_train_batch)
    
            losses.append(regr.loss_)
            test_performance.append(regr.score(X_test, y_test))
    
    
    # Plotting results:
    fig, (ax1, ax2) = plt.subplots(1, 2)
    ax1.title.set_text("Training Loss")
    ax2.title.set_text("Score on test set")
    ax1.plot(range(len(losses)), losses)
    ax2.plot(range(len(test_performance)), test_performance)
    plt.show()
    

    输出:

    【讨论】:

    • 非常感谢,确实是你提到的3.点......不知何故joblib似乎有问题......
    猜你喜欢
    • 2019-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-23
    • 2015-12-01
    • 2017-07-07
    相关资源
    最近更新 更多