我通过子类化keras.Model
建立了一个自定义的FCNN模型。该模型使用我制作的自定义tf操作和keras层,但没有任何Dropout层,这将分别在训练和验证期间导致不同的行为。
在培训过程中,我有一个数据生成器,它不断为网络提供新的输入,而这些输入以前从未用作输入。为了进行验证,我使用了完全相同的生成器来生成1000个输入,然后将它们存储在内存中。
我在相同的输入上并行训练两个模型,一个是我的,另一个是Deeplabv3 +,通过将模型定义为函数而不是我的子类keras.Model
来实现。
在训练期间,我希望训练和验证损失(分类交叉熵)非常相似,因为训练过程与验证使用同一发生器,并且从未像验证一样两次看到相同的数据。这就是问题所在:对于实际的功能性Deeplabv3 +模型,对我而言,这根本不是真的。 Deeplabv3 +的训练损失为0.14,验证损失为0.15,而我的模型的训练损失为0.06,验证损失为0.5。
鉴于训练过程,我无法向自己解释这种错误的验证错误是怎么可能的,因此我怀疑tf或keras在验证期间以某种方式破坏了模型状态,因此我的问题是:
tf.keras中除Dropout之外是否还有其他层或功能在验证过程中和训练期间的行为不同?
在一个时期的训练阶段之后,keras对模型状态有何影响?
在构建子类keras.Model
时,在这方面我需要考虑什么吗?过去,我遇到过这样的问题,例如在嵌套模型时无法正确保存和加载权重,或者没有给图层适当的名称。可能与此有关吗?