You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

TensorFlow 2.x中未应用梯度更新却出现预测结果与损失值变化的问题咨询

问题根源:Dropout层的training=True参数导致的随机行为

你遇到的这个问题其实很好解释——核心原因就是你在调用模型时设置了training=True,而你的模型里包含了Dropout层,这个层在训练模式下会引入随机行为,导致相同输入和权重下的预测结果(以及损失值)每次都不一样,但不会修改模型的可训练权重。

具体拆解:

  1. Dropout的工作机制:
    Dropout层是用来防止过拟合的,当training=True时,它会在每次前向传播过程中随机丢弃50%的神经元(你设置的Dropout(0.5)),而且每次丢弃的神经元位置都是随机的。这种随机性直接改变了模型的计算路径,所以即便是相同的输入和权重,每次输出的预测值也会不同,最终导致损失值波动。

  2. 为什么权重没变化:
    从你给出的两次循环的权重输出可以看到,my_model/dense_3/kernel的参数值完全一致——因为Dropout的随机丢弃只是在前向计算时临时关闭神经元,并不会修改模型的可训练权重,所以你观察到权重没有变化是完全正常的,这和是否调用apply_gradient无关。

验证结论的快速测试:

你可以把循环里的training=True改成training=False再运行,此时Dropout层会切换到推理模式,不再随机丢弃神经元,每次的损失值就会完全相同:

vars_list = []
for i in range(5):
    # 切换到推理模式
    predictions = model(x_train[:10].reshape(10,-1), training=False)
    loss = loss_object(y_train[:10], predictions)
    vars = model.trainable_weights
    vars_list.append( vars )
    print(loss)

小提示:

在实际训练流程中,我们只会在需要更新梯度的训练步骤中设置training=True,在验证、测试或者单纯检查模型输出时,一定要把training设为False,避免Dropout的随机行为干扰结果判断。

内容的提问来源于stack exchange,提问作者myeonggyu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.28 13:38:13