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

训练循环中feed_dict在交叉熵与准确率计算的作用差异咨询

理清训练循环里的指标计算逻辑

嘿,我来帮你拆解这段代码里的设计逻辑,你的疑惑其实是训练过程中不同指标的作用差异导致的,咱们一个个说清楚:

1. 为什么测试准确率要用测试集(x_test/y_test),而不是训练批次数据?

测试准确率的核心目的是评估模型的泛化能力——也就是模型在完全没见过的新数据上的表现。如果用训练集的batch数据来算测试准确率,那得到的只是模型对训练数据的“记忆程度”,根本没法判断模型是不是真的学会了数据里的规律,也发现不了过拟合问题(比如训练数据上表现极好,但新数据一塌糊涂)。所以必须用独立的测试集来计算,才能得到真实的模型性能反馈。

2. 为什么交叉熵损失只喂入当前批次的batch数据?

这段代码用的是小批量梯度下降(Mini-batch Gradient Descent),这是深度学习里最常用的训练方式:

  • 每次训练只取一小部分训练数据(batch)来计算梯度,更新模型参数,这样既比用全量数据训练快很多,又能保证梯度更新的稳定性。
  • 这里计算的交叉熵是当前批次的损失值,它的作用是指导模型参数更新——我们只需要当前批次的损失来调整模型,不需要计算整个训练集的损失(计算全量损失耗时太长,也没必要)。
  • 同时打印当前批次的损失,能让我们直观看到训练过程中损失的变化趋势,判断模型是不是在收敛(比如损失逐渐下降并趋于稳定)。

3. 为什么训练准确率要用全量训练集(x_train/y_train)?

代码里每100步用全量训练集计算训练准确率,是为了看模型在所有训练数据上的整体表现,和当前批次的损失、测试准确率结合起来:

  • 如果训练准确率持续上升,说明模型在训练数据上的表现越来越好;
  • 如果训练准确率很高但测试准确率停滞不前,那就要警惕过拟合了——模型已经把训练数据记熟了,但没法应对新数据。

再回头看代码里的循环逻辑(顺便提一句,代码里的i = nstep % nSteps应该是i = j % nSteps的笔误):

for j in range(nSteps):
    i = j % nSteps
    batch_xs = np.reshape(x_train,(nSteps,bSize,nPixels))
    batch_ys = np.reshape(y_train,(nSteps,bSize,nLabels))
    sess.run(train_step, feed_dict={x: batch_xs[i], y_: batch_ys[i]})  # 用当前批次训练模型
    if j % 100 ==0:
        train_acc = sess.run(accuracy, feed_dict={x: x_train,y_: y_train})  # 全量训练集看整体训练效果
        test_acc = sess.run(accuracy, feed_dict={x: x_test, y_: y_test})  # 测试集看泛化能力
        loss = sess.run(cross_entropy, feed_dict={x: batch_xs[i], y_: batch_ys[i]})  # 当前批次损失看训练收敛趋势

这种搭配是很经典的训练监控方式,能全面跟踪模型的训练状态。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:29:32