一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第10天,点击查看活动详情。
批大小对模型准确率的影响
在原始神经网络中,我们对于构建的所有模型使用的批大小 (batch size
) 为均为 64
。在本节中,我们将研究改变批大小对准确率的影响。 为了探究批大小对模型准确率,我们对比一下两种情况:
- 批大小为 4096
- 批大小为 64
与批大小较小的情况相比,批大小较大时,每个 epoch
中的权重更新次数较少。当批大小较小时,每个 epoch
会进行多次的权重更新,因为在每个 epoch
中,必须遍历数据集中的所有训练数据,因此如果每个 batch
使用较少的数据计算损失值,会导致每个 epoch
具有更多的 batch
才能遍历整个数据集。因此,batch
大小越小,相同 epoch
训练后的模型准确率越好。但是,还应确保批大小不能过小,以免导致过拟合。
在先前的模型中,我们使用了批大小为 64 的模型。本节中,我们继续使用相同的模型架构,仅修改模型训练的批大小,以比较不同批大小对模型性能的影响。预处理数据集并拟合模型:
(x_train, y_train), (x_test, y_test) = mnist.load_data()
num_pixels = x_train.shape[1] * x_train.shape[2]
x_train = x_train.reshape(-1, num_pixels).astype('float32')
x_test = x_test.reshape(-1, num_pixels).astype('float32')
x_train = x_train / 255.
x_test = x_test / 255.
y_train = np_utils.to_categorical(y_train)
y_test = np_utils.to_categorical(y_test)
num_classes = y_test.shape[1]
model = Sequential()
model.add(Dense(1000, input_dim=num_pixels, activation='relu'))
model.add(Dense(num_classes, activation='softmax'))
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['acc'])
history = model.fit(x_train, y_train,
validation_data=(x_test, y_test),
epochs=50,
batch_size=4096,
verbose=1)
代码的唯一更改是模型拟合过程中的 batch_size
参数。绘制不同 epoch
的训练和测试的准确率和损失值(绘制曲线图的代码与训练原始神经网络中使用的代码完全相同)::
在上图中可以注意到,与批大小较小时的模型相比,批大小较大时模型需要训练更多的 epoch
准确率才能达到了 98%。在本节模型中,刚开始的训练阶段,模型准确率相对较低,并且只有在运行了相当多的 epoch
后模型的准确率才能达到较高水平。其原因是,批大小较小时,在每个 epoch
中权重更新的次数要少得多。
数据集总大小为 60000,当我们以批大小为 4096 运行模型 500 个 epoch 时,权重更新进行了 次。当批大小为 64 时,权重更新进行了 次。因此,批大小越小,权重更新的次数就越多,并且通常在 epoch 数相同的情况下,准确率越好。同时,应注意批大小也不能过小,这可能导致训练时间过长以及过拟合情况的出现。