2

背景

我正在观看关于机器学习的流行 YouTube 速成课程。

3:35:50,他提到该模型可能过拟合,因此用更少的 epoch 再次拟合它。

由于他没有重新实例化模型,这不等于用相同的数据拟合模型,从而继续过度训练它吗?

我的问题

假设您已创建模型并准备好数据。

你跑:

model.fit(train_images, train_labels, epochs=10)
model.fit(train_images, train_labels, epochs=8)

这是否等同于运行:

model.fit(train_images, train_labels, epochs=18)

或者:

model.fit(train_images, train_labels, epochs=8)

如果先前拟合的数据被覆盖,为什么model.fit第二次运行以先前模型的准确性开始?

在有关保存和训练模型的多个 其他 问题中,公认的解决方案是加载先前训练的模型,然后model.fit再次运行。

如果这会覆盖预先存在的权重,那不是首先破坏了保存模型的目的吗?第一次在新数据上训练模型不是等效的吗?

在保持所有数据准确性的同时,在多个相似数据集上训练模型的适当方法是什么?

4

3 回答 3

3

由于他没有重新实例化模型,这不等于用相同的数据拟合模型,从而继续过度训练它吗?

你是对的!为了检查在他的示例中哪个 epoch 会更好,他应该再次编译网络(即再次执行上述单元格)。

请记住,一般来说,每当您再次实例化模型时,它很可能会以全新的权重开始,与过去的权重完全不同(除非您手动更改)。因此,即使您保持相同数量的 epoch,您的最终准确度也会根据初始权重而变化。

这两个命令是否等效?

model.fit(train_images, train_labels, epochs=10)
model.fit(train_images, train_labels, epochs=8)

model.fit(train_images, train_labels, epochs=18)

不。

在第一种情况下,您正在训练您的网络,其中一些权重X会遍历所有训练集 10 次,然后您将权重更新为某个值y。然后你将再次训练你的网络,尽管你的所有训练集 8 次,但现在你使用的是带有权重的网络X+y

对于第二种情况,您将使用权重对您的所有训练数据进行 18 次网络训练X

这是不同的!

于 2020-05-31T18:47:37.253 回答
2

当你运行 with

model.fit(train_images, train_labels, epochs=10)
model.fit(train_images, train_labels, epochs=8)

正如您所提到的,模型没有重新初始化,因此模型对象将包含上一列火车的值,因此继续。

刚刚意识到该模型正在 colab 中运行。

然后当他跑

model.fit(train_images, train_labels, epochs=10)

他是第一次训练它,发现它过度拟合,然后他的目标是将 epoch 减少到 8 并尝试一下。

model.fit(train_images, train_labels, epochs=8)

他想要做的是运行 8 个 epoch,但由于它在 colab 中,并且第一次运行的 model.fit() 仍然在对象中,它的行为就像它运行了 18 个 epoch 并且过度拟合

至于如何避免过拟合,其中一种方法是使用 EarlyStopping 和 ModelCheckpoint 。

于 2020-05-31T18:32:42.147 回答
-1

为避免过度拟合,您可以添加 Dropout 层,它会丢失%连接,您只需将其添加到 Dense 层之间的模型中。

from keras.layers import Dropout
Dropout(0.2)  # droping 20% only in training
于 2020-05-31T19:33:27.800 回答