Keras深度学习——批大小对神经网络模型准确率的影响

1,143 阅读3分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 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 时,权重更新进行了 500×(60000÷4096)=7000500\times(60000\div4096)= 7000 次。当批大小为 64 时,权重更新进行了 500×(60000÷32)=468500500\times(60000\div32)=468500 次。因此,批大小越小,权重更新的次数就越多,并且通常在 epoch 数相同的情况下,准确率越好。同时,应注意批大小也不能过小,这可能导致训练时间过长以及过拟合情况的出现。

相关链接

Keras深度学习——训练原始神经网络

Keras深度学习——缩放输入数据集提升神经网络性能