我的网络在我的数据集上达到了96%的准确率(编辑:在预测9个类别时)。每次运行时,我都会保存每个epoch的整个模型(包括权重)。我运行了三次,每次测试不同的超参数,每次都达到了大约96%的准确率。
当我现在尝试加载这些测试中的任何一个并再次运行时,它的准确率大约为50%。我非常确定我是在同一个数据集上运行的。
有趣的是:如果我训练一个新的网络实例,具有完全相同的架构、大小、形状等,它的最高准确率只能达到85%。此外,保存和加载这些新训练的模型可以正确工作,也就是说,模型会达到相同的85%准确率。
因此,加载和我的数据集都没有问题。唯一可能导致这种情况的原因是我的自定义层有问题,或者其他地方出了问题。
不幸的是,我没有将自定义层的全部更改提交到git。虽然我不能保证我的自定义层完全相同,但我几乎完全有信心它是相同的。
有什么想法可以解释这种差异的原因吗?
编辑:为了提供更多背景信息,该层是从ConvLSTM2d类中提取的,但我替换了call()函数,使其成为一个使用卷积而不是点积的普通RNN。我确信call()函数与之前相同,但我对类的其余部分是否相同没有信心。类中的其他部分是否会影响性能?我已经检查过激活函数了。
回答:
我终于找到了答案。
我实现了一个自定义的Lambda层来处理重塑。这个层在加载时有困难。具体来说,它在一个任意间隔上将一个维度重塑为两个维度。每次加载模型时,间隔都会默认设置为一个特定的值,即使这是错误的。当我强制将其设置为正确的间隔时,它就工作了。