我正在观看流行的 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
。
如果这会覆盖预先存在的权重,这是否就违背了保存模型的初衷?第一次使用新数据训练模型不是等价的吗?
在多个相似的数据集上训练模型同时保持所有数据的准确性的适当方法是什么?
既然他没有重新实例化模型,这不就相当于 使用相同的数据拟合模型,从而继续过度训练 是吗?
你说得对!为了检查在他的示例中哪个纪元数会更好,他应该再次编译网络(即再次执行上述单元格)。
请记住,一般来说,每当您再次实例化模型时,它很可能会以全新的权重开始,与过去的权重完全不同(除非您手动更改)。因此,即使您保持相同数量的 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
。
对于第二种情况,您将使用权重
X
通过所有训练数据训练网络 18 次。
这不一样!
当您运行时
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 。
为了避免过度拟合,您可以添加 Dropout 层,它会丢弃
%
的连接,您只需将其添加到 Dense 层之间的模型中即可。
from keras.layers import Dropout
Dropout(0.2) # droping 20% only in training