Python Tensorflow - 多次运行 model.fit 而不重新实例化模型

Posted

技术标签:

【中文标题】Python Tensorflow - 多次运行 model.fit 而不重新实例化模型【英文标题】:Python Tensorflow - Running model.fit multiple times without reinstantiating the model 【发布时间】:2020-09-19 01:29:59 【问题描述】:

背景

我正在观看关于机器学习的 popular YouTube crash course。

在3:35:50,他提到模型可能过拟合,所以用更少的时期再次拟合。

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

我的问题

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

你跑:

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)

如果previously fitted data is overwritten,为什么第二次运行model.fit会以之前模型的精度开始?

在multipleotherquestions关于保存和训练模型,可接受的解决方案是加载之前训练的模型,并再次运行model.fit

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

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

【问题讨论】:

你是对的。拟合 10 个 epoch 然后 8 个 epoch 相当于拟合 18 个 epoch。视频中的笔记本中发生了一些奇怪的事情。也许当他按下播放或其他东西时,他的模型会重新加载。引用问题中的答案是关于 scikit learn 模型,与 keras 模型无关。 【参考方案1】:

当你运行 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 。

【讨论】:

【参考方案2】:

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

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

请记住,一般来说,每当您再次实例化模型时,它很可能会以全新的权重开始,与过去的权重完全不同(除非您手动更改)。因此,即使您保持相同数量的 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在上面的单元格中被定义为一个变量。如果您有一个带有x = 10 的单元格,下面有一个带有x = x + 10 的单元格,则每次运行第二个单元格时,x 将增加10。我相信模型也会出现类似的结果。 我会再检查一遍! 我理解你的第二点 - 这是有道理的。谢谢!尽管在同一数据集上运行 model.fit 两次并不完全等同于以相同数量的 epoch 运行一次,但在他的示例中,他似乎继续过度训练他的数据集。我相信他的意图是清除模型的所有历史并以更少的时期运行它,而他并没有通过再次运行fit 来实现。这有意义吗,你同意吗? @BriceFrisco 我更新了答案,感谢您的更正! it seems in his example that he is continuing to overtrain his dataset. I believe his intention was to clear all history of the model and run it with less epochs, which he is not accomplishing by running fit again.是的,我完全同意【参考方案3】:

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

from keras.layers import Dropout
Dropout(0.2)  # droping 20% only in training

【讨论】:

以上是关于Python Tensorflow - 多次运行 model.fit 而不重新实例化模型的主要内容,如果未能解决你的问题,请参考以下文章

tensorflow 使用

win10环境下使用python安装tensorflow

numba和tensorflow一起给出了CUDA_ERROR_OUT_OF_MEMORY

在 python 3.4 中导入 tensorflow 时出错“无法加载本机 TensorFlow 运行时”

在Windows和Python上运行TensorFlow包失败

tensorflow 运行 python convolutional.py时