TensorFlow训练疑问:每个Epoch步数为1875,未遍历全部60000样本?
关于Keras训练MNIST时Epoch显示数据点的疑问解答
问题描述
我使用Keras和TensorFlow基于MNIST数据集构建基础神经网络,代码如下:
import os import tensorflow as tf from tensorflow import keras from tensorflow.keras import layers from tensorflow.keras.datasets import mnist (x_train, y_train), (x_test, y_test) = mnist.load_data() x_train = x_train.reshape(-1, 28*28).astype('float32') / 255.0 x_test = x_test.reshape(-1, 28*28).astype('float32') / 255.0 print(x_train.shape) print(x_test.shape) model = keras.Sequential( [ keras.Input(shape=(28*28)), layers.Dense(512, activation="relu"), layers.Dense(256, activation="relu"), layers.Dense(10), ] ) model.compile( loss = keras.losses.SparseCategoricalCrossentropy(from_logits=True), optimizer = keras.optimizers.Adam(learning_rate=0.001), metrics = ['accuracy'], ) model.fit(x_train, y_train, batch_size=32, epochs=5, verbose=2)
训练输出显示每个Epoch仅处理1875个数据点(即60000÷32),但训练集共有60000条记录,为何未遍历全部样本?
解答
这是个误解,1875是batch的数量,不是数据点数量。
MNIST训练集共60000条数据,你设置的batch_size=32,意味着每个训练步处理32条数据,一个Epoch要跑完所有训练数据,就需要执行 60000 ÷ 32 = 1875 个训练步。
Keras在verbose=2模式下,每个Epoch输出的数字就是这个训练步的数量,而非处理的数据点总数。实际上每个Epoch已经完整遍历了60000条训练样本——1875个batch × 32条数据/批次 = 60000条,刚好是训练集的总数据量。
如果想验证这一点,可以把verbose设为1,这样会显示进度条,能直观看到每个Epoch是从0到1875个batch逐步完成,背后对应的就是全部60000条数据的训练。
内容的提问来源于stack exchange,提问作者DumbCoder
相关产品推荐
相关产品推荐

