作为硕士学位项目的一部分,我试图构建一个对象检测模型。
当我们使用神经网络时,批量大小是一个重要的超参数。从我之前学到的问题中,每个小批量都是随机采样的,没有从数据集中替换(https://stats.stackexchange.com/questions/235844/should-training-samples-randomly-drawn-for-mini-batch-training-neural-nets-be-dr)。
然而,我不确定TFOD对迷你批次的处理方法:
- TFOD如何将训练数据中的图像采样到小批量中?(随机抽样,不更换?(
- 如果我们在没有替换的情况下采样,并到达数据集的末尾,我们该怎么办?数据是否重复
我试图在TFOD框架的内部函数中寻找答案,但只找到了dataset_builder.build((函数,该函数只构建准备好的数据集,但不负责批量采样。
如果有任何想法,我将不胜感激!谢谢你们!
def build(
input_reader_config,
batch_size=None,
transform_input_data_fn=None,
input_context=None,
reduce_to_frame_fn=None,
):
"""Builds a tf.data.Dataset."""
此问题(或答案(并非特定于对象检测。你有同样的";"问题";在其他任务中,尽可能远地使用梯度递减算法训练模型。
首先要注意的是,我们为什么需要批量:因为梯度太重,成本太高,无法同时为所有数据集计算。因此,为了降低这一成本(特别是在内存方面(,你不需要为整个数据集计算梯度,而是需要取更小的样本,称为批次:你对一个小批次进行采样,比如说,上面有32个例子,然后计算梯度并更新权重。这被称为训练步骤,需要重复进行,直到对所有数据集进行采样。在每个步骤中,随机抽取一批32个样本,不替换。
一旦所有训练数据集都被馈送到模型,一个epoch就完成了。
例如,如果您的数据集包含320个示例,并且您使用的批量大小为32,则10个训练步骤将完成一个历元。
从实现的角度来看,通常数据集在历元开始之前被打乱,然后打乱的数据被连续分批返回,类似于这样:
def sample_data(dataset_list, batch_size):
np.random.shuffle(dataset_list)
for i in range(0, len(dataset_list), batch_size):
yield dataset_list[i:i+batch_size]
通常,这种逻辑已经在tensorflow或torch等标准包中实现。
也就是说,通常一个时代是不够的,所以,一旦结束,你就开始另一个时代。划时代的正确数量实际上取决于问题。
最后,考虑一下,在某些特殊情况下,可能不会定义历元,比如在强化学习问题中,还有其他情况下,采样不是均匀随机的,甚至是替换的,但这些不是标准。