在Keras中加载带有自定义层的保存模型时,预测结果为何不同?

我的网络在我的数据集上达到了96%的准确率(编辑:在预测9个类别时)。每次运行时,我都会保存每个epoch的整个模型(包括权重)。我运行了三次,每次测试不同的超参数,每次都达到了大约96%的准确率。

当我现在尝试加载这些测试中的任何一个并再次运行时,它的准确率大约为50%。我非常确定我是在同一个数据集上运行的。

有趣的是:如果我训练一个新的网络实例,具有完全相同的架构、大小、形状等,它的最高准确率只能达到85%。此外,保存和加载这些新训练的模型可以正确工作,也就是说,模型会达到相同的85%准确率。

因此,加载和我的数据集都没有问题。唯一可能导致这种情况的原因是我的自定义层有问题,或者其他地方出了问题。

不幸的是,我没有将自定义层的全部更改提交到git。虽然我不能保证我的自定义层完全相同,但我几乎完全有信心它是相同的。

有什么想法可以解释这种差异的原因吗?

编辑:为了提供更多背景信息,该层是从ConvLSTM2d类中提取的,但我替换了call()函数,使其成为一个使用卷积而不是点积的普通RNN。我确信call()函数与之前相同,但我对类的其余部分是否相同没有信心。类中的其他部分是否会影响性能?我已经检查过激活函数了。


回答:

终于找到了答案。

我实现了一个自定义的Lambda层来处理重塑。这个层在加载时有困难。具体来说,它在一个任意间隔上将一个维度重塑为两个维度。每次加载模型时,间隔都会默认设置为一个特定的值,即使这是错误的。当我强制将其设置为正确的间隔时,它就工作了。

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注