【问题标题】:How does cross validating with Keras fit?使用 Keras 进行交叉验证如何适应?
【发布时间】:2020-04-19 20:45:48
【问题描述】:

我有相当少量的数据,所以我决定尝试交叉验证,以便获得所有数据的预测。像这样:

for train_index, test_index in KFold(9, shuffle = True, random_state = 42).split(range(len(df))):
    train_data, test_data = df[train_index], df[test_index]
    train_images, test_images = images[train_index], images[test_index]
    train_labels, test_labels = labels[train_index], labels[test_index]

    model.fit([train_data, train_images], train_labels, epochs = 100, batch_size = 5)

    model.predict([test_data, test_images])

据我了解,这样做每次都会训练一个 模型(总共 9 次)。但是,如果是这种情况,那么我的损失输出就没有意义了:

顶部的灰色曲线是第一次迭代,它从接近 1 开始,然后下降。随后的迭代都显着降低。

我想了解我在这里做错了什么 - 我想全面训练新网络 9 次,然后每次都得到预测。

【问题讨论】:

    标签: python machine-learning keras cross-validation k-fold


    【解决方案1】:

    当调用model.fit 时,参数估计将在它停止的地方继续,所以你是对的,一旦你到达循环的第二次迭代,你将使用你在第一次迭代中获得的任何东西。

    为避免这种情况,您需要在每次迭代之间重置模型的参数。一种方法是在每次迭代中简单地从头开始创建模型。唯一需要注意的是,默认情况下,权重是使用随机值初始化的(以避免目标的局部极值),因此如果您只是完全重新初始化模型,您将使用不同的随机起点。为避免这种情况,并确保每次迭代都使用相同的起点,您可以修复初始值(例如,通过修复随机种子),或者只使用 Keras 提供的内容,然后使用 model.save prior到第一次迭代,并在每次迭代开始时load_model,即做相当于

    from keras.models import load_model
    
    model = ...
    model.save('initial.h5')
    for ... in KFold
        model = load_model('initial.h5')
        model.fit(...)
        model.predict(...)
    

    您不必担心这一点:您也可以简单地选择将随机初始化视为抽象统计模型的一部分,您正在尝试估计其泛化误差,并对每次迭代的新起点感到满意.

    【讨论】:

    • 谢谢,这很有帮助!但我不同意最后一句话。如果迭代 2 在迭代 1 停止的地方继续进行,则意味着训练迭代 1 的一些样本现在被排除在 进一步 训练中,并将在迭代 2 结束时进行验证,即一个问题。因此,如果我想避免重大偏见,则需要完全重启。
    • 也许我的最后一句话不清楚:当然你应该担心从迭代 1 中获取信息。你可以选择不担心的是你是否为每次迭代使用完全相同的起点,如果每次迭代只使用一个(新的)随机起点就可以了。
    • 不客气。如果您觉得答案有帮助,您可以mark it as accepted
    【解决方案2】:

    除了@fuglede,我建议你在model.fit 中使用validation_split 参数。您不需要自己进行拆分。 Keras 会处理这个问题。

    【讨论】:

      猜你喜欢
      • 2017-05-04
      • 2020-03-04
      • 2017-04-12
      • 2022-01-25
      • 2021-09-30
      • 2020-11-30
      • 2017-06-29
      • 2017-04-10
      • 2015-06-11
      相关资源
      最近更新 更多