TensorFlow 的 model.fit() 函数中的 batchSize 是多少?

What is the batchSize in TensorFlow's model.fit() function?

使用 TensorFlow.js 定义模型后,您可以 运行 model.fit() 对其进行训练。这个函数有很多参数,包括一个配置对象。这个对象有一个 属性 batchSizedocumentation on model.fit() 只是说:

Number of samples per gradient update. If unspecified, it will default to 32.

虽然这在技术上可能是一个正确的答案,但实际上并没有帮助。我为什么要更改此号码?我已经意识到,如果我增加它,训练就会变得更快,而如果我减少它,它就会变慢。但是 究竟 我在这里改变了什么?我为什么要改变它?我需要注意什么?

有什么提示吗?

批量大小是您用于执行一步随机梯度下降 (SGD) 的训练示例数。

什么是 SGD? SGD 是梯度下降 (GD),但是,不是使用所有训练数据来计算损失函数相对于网络参数的梯度,而是仅使用训练数据集的一个子集。因此形容词“随机”,因为,通过仅使用训练数据的一个子集,您将 近似 随机(即您将引入噪声)将通过使用所有计算的梯度您的训练数据,这将被视为损失函数相对于参数的“实际”梯度。

Why should I change this number? I have realized that if I increase it, training gets faster, and if I decrease it, it gets slower. But what exactly am I changing here? Why would I change it? What do I need to watch out for?

如果批量太小,例如1,那么你将只用一个训练样本计算梯度。这会使你的训练损失波动很大,因为每次你只用一个训练样本来近似梯度,这通常不能代表整个训练数据。因此,根据经验,您使用的训练示例越多,您对梯度的近似就越好(这将对应于所有训练示例),因此这可能会导致更快的收敛。 但是,在实践中,如果您使用许多训练示例,计算量也会很大。例如,假设您的训练数据由数百万个训练示例组成。在这种情况下,要执行一步梯度下降,您需要遍历所有这些训练示例,这可能会花费很多时间。因此,您可能需要等待很长时间才能看到模型的参数是如何更新的。这可能并不理想。

总而言之,小批量会使您的训练过程发生振荡,这会使您的损失函数需要很长时间才能达到局部最小值。然而,巨大的批量大小也可能是不可取的,因为它也会花费很多时间。

批量大小的典型值为 32、64 和 128。为什么?人们之所以使用这些数字,是因为它们在经验上似乎是小批量和大批量之间的良好折衷(在收敛性、训练时间等方面)。

真的很简单。例如,假设您有一个包含 50,000 个样本和相关标签的训练集。在经典理论中,您将为模型提供所有 50,000 个输入(批量大小 = 50,000),然后通过反向传播调整网络权重。因此,对于 50,000 个样本,您只能获得 1 次网络权重迭代(1 个纪元)。这有两个问题。一是训练网络所需的时间。可以说要获得高精度需要 50 次迭代(Epochs)。在这种情况下,您必须向网络提供 50 X 50,000 个样本。这将花费大量的处理时间。其次,如果批量大小为 50,000,则所有 50,000 个样本都位于 memory.If 中,例如,您正在处理图像,这会占用大量内存并可能导致资源耗尽错误。现在让我们采取不同的策略。将您的训练集分成 1000 个样本组,因此您将有 50 个组(批次)。现在,您为网络提供第一批 1000 个样本,然后通过反向传播 (Epoch1) 调整权重。然后对下一批 1000 个样本再次执行此操作并再次进行反向传播 (Epoch2)。对所有 50 个批次重复此操作。最后,您向网络提供了 50,000 个样本,并且调整了 50 次权重。结果是你训练得更快,如果你批量获取样本,你只有 1000 个样本驻留在内存中。这里有一个权衡。例如,如果您设置 batch size=1 训练将花费很长时间,因为您将反向传播 50,000 次。所以最好选择适中的batch size。我通常 select 它在 30 到 80 之间,如果你有 16G 的 GPU 内存,这似乎适用于更大的图像,如 254 X 254 X 3。