Python自定义模型与Keras的简易梯度下降对比问题
以下是几个可能导致你的模型与Keras模型权重逐渐偏离的默认设置差异,以及对应的排查点:
Dense层默认包含偏置:Keras的
Dense层默认启用偏置(use_bias=True),且默认用零初始化。如果你的自定义模型没有使用偏置,或者偏置的初始化方式不同,会直接导致前向传播和梯度更新的差异。请确认你的模型是否包含偏置,且初始值与Keras一致。损失函数的数值实现细节:Keras的
binary_crossentropy使用了数值稳定的计算方式(例如避免对数输入为0的情况),如果你的手动损失计算没有做类似处理,会导致损失值的细微差异,进而影响梯度更新方向。可以用相同的预测结果和标签,分别计算两者的损失值对比验证。数据类型与精度差异:Keras默认使用
float32进行计算,若你的自定义模型使用float64,数值精度的差异会随着训练轮次积累,最终导致权重偏离。检查两者的数据类型是否一致。激活函数的实现差异:比如ReLU的梯度处理(x=0处的梯度定义)、sigmoid的数值稳定计算,Keras的实现可能和你手动编写的版本有细微差别。可以用相同输入对比两者的激活输出结果。
权重更新的时机与梯度累加:虽然你设置了
batch_size=150(全批次梯度下降),但需确认Keras的SGD是否是在计算完整个批次的梯度后一次性更新权重,和你的自定义模型更新逻辑完全一致。此外,set_weights时要确保权重的顺序与Keras一致:每个Dense层的权重列表是[kernel, bias],其中kernel形状为(输入维度, 输出维度),bias形状为(输出维度,)。
验证步骤
- 前向传播验证:用相同的输入数据,分别运行两个模型,对比输出结果是否完全一致。若不一致,逐层排查权重、偏置、激活函数的差异。
- 损失值验证:用相同的预测输出和真实标签,计算两者的损失值,确认是否一致。
- 梯度验证:获取Keras模型的梯度(可通过
tf.GradientTape手动计算),与你的模型计算的梯度对比,定位差异来源。
内容的提问来源于stack exchange,提问作者AdamS

