训练循环中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
相关产品推荐
相关产品推荐

