使用自定义图层将已保存的模型加载到Keras中,预测结果是否不同?

时间:2018-08-17 03:21:11

标签: python tensorflow machine-learning keras keras-layer

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

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

这是有趣的事情:如果我训练一个具有完全相同的体系结构,相同的大小,形状等的新网络实例,则只能达到最高85%的精度。此外,保存并加载这些新的训练模型可以正确执行 ,因为该模型将达到相同的85%准确性。

因此,我的数据集存在 no 问题,而 no 问题。发生这种情况的唯一方法是,在我的自定义层中出现问题或发生其他事情。

不幸的是,我尚未将对定制层的所有更改都提交给git。尽管我不能保证自定义图层完全相同,但我几乎完全有信心。

有什么想法可以引起这种差异?

编辑:要添加更多上下文,请从ConvLSTM2d类中剥离该层,但我将call()函数替换为简单的使用卷积而不是点积的普通RNN。我 am 确信call()函数与以前相同,但是我不确定该类的其余部分是否相同。班上还有其他可能影响表现的内容吗?我已经检查了激活功能。

2 个答案:

答案 0 :(得分:1)

好吧,让我们考虑一下,基本上有两个可能导致问题的原因。您的自定义图层不同,因此某些权重设置不正确,这会导致分类错误。如果是二进制分类,那么平衡数据的准确率将达到50%。

第二个可能的原因是,threre是keras序列化中的错误。在这种情况下,反序列化后,新的经过训练和保存的模型也应显示此问题。

  

虽然我不能保证自定义图层完全相同,但我几乎完全有把握。

因此,使用新模型无法再现该问题,您的准确性为50%,并且不能保证自定义图层匹配。 ->我想这是您的自定义图层。

答案 1 :(得分:1)

最终找到了答案。

我已经实现了自定义Lambda层来处理重塑。该层难以加载。具体地说,它以任意间隔将一维重塑为二维。每次我加载模型时,该间隔默认为一个特定值,即使它不正确。当我强制将其设置为正确的时间间隔时,它将起作用。