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

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

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

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

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

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

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

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


回答:

终于找到了答案。

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

Related Posts

Keras Dense层输入未被展平

这是我的测试代码: from keras import…

无法将分类变量输入随机森林

我有10个分类变量和3个数值变量。我在分割后直接将它们…

如何在Keras中对每个输出应用Sigmoid函数?

这是我代码的一部分。 model = Sequenti…

如何选择类概率的最佳阈值?

我的神经网络输出是一个用于多标签分类的预测类概率表: …

在Keras中使用深度学习得到不同的结果

我按照一个教程使用Keras中的深度神经网络进行文本分…

‘MatMul’操作的输入’b’类型为float32,与参数’a’的类型float64不匹配

我写了一个简单的TensorFlow代码,但不断遇到T…

发表回复

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