Gol*_*den 6 tensorflow tensorflow.js
使用 TensorFlow.js 定义模型后,您可以运行model.fit()来训练它。这个函数需要一些参数,包括一个配置对象。这个对象有一个属性batchSize。上的文档model.fit()只是说:
每次梯度更新的样本数。如果未指定,则默认为 32。
虽然这可能是技术上正确的答案,但它并没有真正的帮助。我为什么要更改这个数字?我意识到如果我增加它,训练会变得更快,如果我减少它,它会变得更慢。但我到底在改变什么?我为什么要改变它?我需要注意什么?
这有什么提示吗?
这确实相当简单。例如,假设您有一个包含 50,000 个样本和相关标签的训练集。在经典理论中,您将为模型提供所有 50,000 个输入(批量大小 = 50,000),然后通过反向传播调整网络权重。因此,对于 50,000 个样本,您仅获得网络权重的 1 次迭代(1 epoch)。这有两个问题。一是训练网络所需的时间。假设要获得高精度需要 50 次迭代(Epochs)。在这种情况下,您必须向网络提供 50 X 50,000 个样本。这将需要大量的处理时间。其次,批量大小为 50,000,所有 50,000 个样本都驻留在内存中。例如,如果您正在处理图像,这将占用大量内存,并可能导致资源耗尽错误。现在让我们采取不同的策略。将你的训练集分成 1000 个样本的组,这样你就有 50 个组(批次)。现在,您向网络提供第一批 1000 个样本,然后通过反向传播 (Epoch1) 调整权重。然后对下一批 1000 个样本再次执行此操作,并再次进行反向传播 (Epoch2)。对所有 50 个批次重复此操作。最后,您向网络提供了 50,000 个样本,并且调整了权重 50 次。结果是您的训练速度更快,并且如果您批量获取样本,则内存中只有 1000 个样本。这里有一个权衡。例如,如果您设置批量大小=1,训练将花费很长时间,因为您将执行反向传播 50,000 次。所以最好选择适中的批量大小。我通常选择 30 到 80 之间的值,如果您有 16G 的 GPU 内存,即使对于 254 X 254 X 3 等较大图像,这似乎也能很好地工作。
批量大小是用于执行一步随机梯度下降 ( SGD )的训练示例的数量。
什么是新元?SGD 是梯度下降 (GD),但不是使用所有训练数据来计算损失函数相对于网络参数的梯度,而是仅使用训练数据集的一个子集。因此,形容词“随机”,因为仅使用训练数据的一个子集,您将随机地逼近(即您将引入噪声)使用所有训练数据计算的梯度,这将被视为损失函数相对于参数的“实际”梯度。
我为什么要更改这个数字?我意识到如果我增加它,训练会变得更快,如果我减少它,它会变得更慢。但我到底在改变什么?我为什么要改变它?我需要注意什么?
如果批量太小,例如 1,那么您将仅使用一个训练示例计算梯度。这可能会使您的训练损失振荡很多,因为每次您只用一个训练示例来近似梯度,这通常不能代表整个训练数据。因此,根据经验,您使用的训练示例越多,梯度的近似值就越好(这将对应于所有训练示例),因此这可能会导致更快的收敛。然而,在实践中,如果您使用许多训练示例,它的计算成本也可能很高。例如,假设您的训练数据由数百万个训练示例组成。在这种情况下,要执行单步梯度下降,您需要遍历所有这些训练示例,这可能会花费大量时间。因此,您可能需要等待很长时间才能查看模型参数是如何更新的。这可能并不理想。
总而言之,小批量会使您的训练过程出现波动,这会使您的损失函数花费大量时间才能达到局部最小值。然而,大批量也可能是不可取的,因为它也可能需要很多时间。
批量大小的典型值为 32、64 和 128。为什么?人们只是使用这些数字,因为它们凭经验似乎是小批量和大批量之间的良好折衷(在收敛、训练时间等方面)。
| 归档时间: |
|
| 查看次数: |
2237 次 |
| 最近记录: |