使用自定义层在 Keras 中加载保存的模型和预测结果不同?
Loading a saved model in Keras with a custom layer and prediction results are different?
我的网络在我的数据集上达到了 96% 的准确率(编辑:预测 9 classes)。每当我 运行 时,我都会为每个时期(包括权重)保存整个模型。我运行它3次,每次测试不同的超参数,每次都达到96%左右的准确率。
当我现在尝试加载这些测试中的任何一个并再次 运行 时,它达到了大约 50% 的准确率。我非常有信心 运行 在同一个数据集上使用它。
有趣的是:如果我训练一个具有完全相同架构、相同大小、形状等的新网络实例,它最多只能达到 85% 的准确率。此外,保存和加载这些新训练模型 可以正常工作 ,因为在模型中将达到相同的 85% 准确率。
所以,加载 没有 问题,我的数据集 没有 问题。发生这种情况的唯一方法是如果我的自定义层出现问题,或者发生其他事情。
不幸的是,我还没有将我对自定义层的所有更改提交给 git。虽然我无法确定运行我的自定义图层是否完全相同,但我几乎完全相信它是。
对可能导致这种差异的原因有什么想法吗?
编辑:为了添加更多上下文,该层从 ConvLSTM2d class 中删除,但我将 call() 函数替换为简单的普通 RNN,它使用卷积而不是点积。我 是 确信 call() 函数与以前相同,但我不确定 class 的其余部分是否相同。 class 中还有其他可能影响性能的内容吗?我已经检查了激活函数。
好吧,让我们考虑一下,您的问题基本上有两个可能的原因。您的自定义图层不相同,因此某些权重设置不正确,从而导致错误分类。在二元分类的情况下,平衡数据的准确率为 50%。
第二个可能的原因是,keras 序列化中存在一个错误。在这种情况下,您新训练和保存的模型在反序列化后也应显示此问题。
While I can't guarantee that my custom layer is the exact same, I'm almost completely confident it is.
所以问题不能用新模型重现,你的准确度是 50%,你不能保证自定义层匹配。 -> 我猜这是你的自定义层。
我终于找到了答案。
我已经实现了一个自定义 Lambda 层来处理整形。该层加载有困难。具体来说,它在任意间隔上将一维重塑为二维。每次我加载模型时,间隔默认为一个特定值,即使它不正确。当我强迫它成为正确的间隔时,它起作用了。
我的网络在我的数据集上达到了 96% 的准确率(编辑:预测 9 classes)。每当我 运行 时,我都会为每个时期(包括权重)保存整个模型。我运行它3次,每次测试不同的超参数,每次都达到96%左右的准确率。
当我现在尝试加载这些测试中的任何一个并再次 运行 时,它达到了大约 50% 的准确率。我非常有信心 运行 在同一个数据集上使用它。
有趣的是:如果我训练一个具有完全相同架构、相同大小、形状等的新网络实例,它最多只能达到 85% 的准确率。此外,保存和加载这些新训练模型 可以正常工作 ,因为在模型中将达到相同的 85% 准确率。
所以,加载 没有 问题,我的数据集 没有 问题。发生这种情况的唯一方法是如果我的自定义层出现问题,或者发生其他事情。
不幸的是,我还没有将我对自定义层的所有更改提交给 git。虽然我无法确定运行我的自定义图层是否完全相同,但我几乎完全相信它是。
对可能导致这种差异的原因有什么想法吗?
编辑:为了添加更多上下文,该层从 ConvLSTM2d class 中删除,但我将 call() 函数替换为简单的普通 RNN,它使用卷积而不是点积。我 是 确信 call() 函数与以前相同,但我不确定 class 的其余部分是否相同。 class 中还有其他可能影响性能的内容吗?我已经检查了激活函数。
好吧,让我们考虑一下,您的问题基本上有两个可能的原因。您的自定义图层不相同,因此某些权重设置不正确,从而导致错误分类。在二元分类的情况下,平衡数据的准确率为 50%。
第二个可能的原因是,keras 序列化中存在一个错误。在这种情况下,您新训练和保存的模型在反序列化后也应显示此问题。
While I can't guarantee that my custom layer is the exact same, I'm almost completely confident it is.
所以问题不能用新模型重现,你的准确度是 50%,你不能保证自定义层匹配。 -> 我猜这是你的自定义层。
我终于找到了答案。
我已经实现了一个自定义 Lambda 层来处理整形。该层加载有困难。具体来说,它在任意间隔上将一维重塑为二维。每次我加载模型时,间隔默认为一个特定值,即使它不正确。当我强迫它成为正确的间隔时,它起作用了。