【问题标题】:Interpreting training loss/accuracy vs validation loss/accuracy解释训练损失/准确性与验证损失/准确性
【发布时间】:2020-08-08 19:12:41
【问题描述】:

关于使用 Lenet5 网络在 MNIST 上解释某些优化器的性能,以及验证损失/准确度与训练损失/准确度图表确切地告诉我们什么,我有几个问题。 所以一切都是在 Keras 中使用标准 LeNet5 网络完成的,它运行了 15 个 epoch,批量大小为 128。

有两个图表,train acc vs val acc 和 train loss vs val loss。我制作了 4 个图表,因为我运行了两次,一次使用validation_split = 0.1一次使用validation_data = (x_test, y_test) 在model.fit 参数中。具体区别如下:

train = model.fit(x_train, y_train, epochs=15, batch_size=128, validation_data=(x_test,y_test), verbose=1)
train = model.fit(x_train, y_train, epochs=15, batch_size=128, validation_split=0.1, verbose=1)

这些是我制作的图表:

using validation_data=(x_test, y_test):

using validation_split=0.1:

所以我的两个问题是:

1.) 如何解释 train acc vs val acc 和 train loss vs val acc 图?比如它准确地告诉我什么以及为什么不同的优化器有不同的性能(即图表也不同)。

2.) 为什么我使用 validation_split 时图表会发生变化?哪个是更好的选择?

【问题讨论】:

    标签: python keras deep-learning neural-network mnist


    【解决方案1】:

    我会尝试提供答案

    1. 您可以看到,接近尾声的训练准确度略高于验证准确度,训练损失略低于验证损失。这暗示了过度拟合,如果你训练更多的时期,差距应该会扩大。

      即使您使用具有相同优化器的相同模型,您也会注意到运行之间的细微差别,因为权重是随机初始化的,并且随机性与 GPU 实现相关。您可以查看here 以了解如何解决此问题。

      不同的优化器通常会产生不同的图,因为它们更新模型参数的方式不同。例如,普通 SGD 将以恒定速率更新所有参数和所有训练步骤。但是,如果您添加动量,则速率将取决于先前的更新,并且通常会导致更快的收敛。这意味着您可以在较少的迭代次数中达到与普通 SGD 相同的精度。

    2. 图表会发生变化,因为如果随机拆分,训练数据会发生变化。但对于 MNIST,您应该使用数据集提供的标准测试拆分。

    【讨论】:

    • 所以你是说我应该坚持使用validation_data = (x_test, y_test)?
    • 是的,如果这是 MNIST 中提供的测试拆分,您应该这样做
    • @xashru:另外请注意,如果您使用的是 GPU,那么也存在与之相关的随机性。所以即使保存权重也不会每次都给你完全相同的结果。
    • 是的,但我认为这可以通过适当的配置在某种程度上解决,如 PyTorch pytorch.org/docs/stable/notes/randomness.html#cudnn
    猜你喜欢
    • 2021-09-07
    • 2019-09-06
    • 1970-01-01
    • 1970-01-01
    • 2022-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-09
    相关资源
    最近更新 更多