用于设置 epoch 和批量大小的 Keras 直觉/指南

数据挖掘 神经网络 喀拉斯 卷积神经网络
2021-09-23 17:05:56

我正在使用 Python 和 Keras 为图像分类器制作卷积神经网络 (CNN)。我拍摄了大约 50 张文档图像和 150 张非文档图像进行训练。我缩小了分辨率,scipy.misc.imresize(small, (32,32))用于标准化图像,在查看这些像素化图像时,我认为我仍然可以分辨照片和文档之间的区别,所以我认为 ML 算法应该也可以。

我的问题是关于时期数和批量大小。我目前正在使用model.fit(X_train_temp, y_train_temp, epochs=N_epochs, batch_size=batch_size, verbose=verbose). 我在这里看到了有关该主题的问题:

如何设置 batch_size、steps_per epoch 和验证步骤

但答案非常基于定义;我在寻找直觉。我想知道是否有关于为给定问题设置纪元数和批量大小的值的一般准则。我对 epoch 数和批量大小进行了粗略的参数扫描。这是CNN模型:

model = Sequential()
model.add(Conv2D(32, kernel_size=(3, 3), input_shape=input_shape, activation='sigmoid'))
model.add(Conv2D(32, kernel_size=(3, 3), input_shape=input_shape, activation='sigmoid'))
model.add(Flatten())
model.add(Dense(num_classes, activation='sigmoid'))
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])

结果如下:

在此处输入图像描述

以下是我迄今为止所做的一些观察。圆圈区域似乎非常适合训练,因为相对较早地实现了高精度,并且随着进一步的时期过去,它似乎没有太大的波动。这似乎batch_size = 1通常是一个坏主意,因为训练似乎并没有改善模型。此外,这似乎batch_size >~ N_epochs是可取的。

问题1:一般batch_size = 1是坏的?或者这只是为了我的特定参数扫描?

问题2:一般情况下N_epochs >~ batch_size推荐吗?

问题 3:谁能谈谈问题 2 中概括的稳健性?

谢谢你。

1个回答

实际上,这是有争议的,并且可能因一个问题而异。最好的办法是搜索超参数空间以获得最佳结果。

  • 对于问题 1

这里我引用 CNN 之父(Yann Lecun)的话:“用大 minibatch 训练对你的健康有害。更重要的是,它对你的测试错误有害。朋友不要让朋友使用大于 32 的 minibatch。

让我们面对现实吧:自 2012 年以来,唯一切换到大于 1 的 minibatch 大小的人是因为 GPU 对于小于 32 的批处理大小效率低下。这是一个可怕的原因。这只是意味着我们的硬件很糟糕。

更糟糕的是,并行化训练的最简单方法是使 minibatch 更大,并将其分布在多个 GPU 和多个节点上。超过 1024 的小批量不仅对您的健康有害。它们会导致脑瘤。他们学得很快,但做错了事。...

Update2:我指的是这篇特定的论文,作为提出一般观点的一种方式。但我不一定赞同本文中的特定结果或方法(有些人指出了方法中的一些缺陷)。尽管如此,主要的一点是,使用大于 1 的批量大小的唯一原因是我们可以使用的硬件的局限性。”

本文中,建议使用 2 到 32 之间的批次值

  • 对于问题 2 和 3:

通常通过将时期数设置为非常大的数字来使用早期停止技术,当泛化错误变得更糟时,我们就停止。请看_

有关详细信息和说明,请参阅

最后,我建议对隐藏层使用“ReLu”激活函数,而不是“sigmoid”。它学得更快