我正在使用张量流训练一维CNN,以从传感器数据中检测特定事件。虽然具有数以千万计样本的数据很容易以一维浮点数组的形式拟合到ram,但显然需要大量内存才能将数据存储为N x inputDim数组,该数组可以传递给模型。 。虽然我可以使用model.fit_generator或model.train_on_batch即时生成所需的迷你批处理,但由于某种原因,即使所有内容都存储在内存中,我也观察到了model.fit和model.fit_generator&model.train_on_batch之间的巨大性能差距迷你批处理的生成速度很快,因为它基本上只包含重塑数据。因此,我想知道自己是在做错什么还是在预期性能上会出现这种差距。我正在将Tensorflow 2.0的cpu版本与3.2 GHz Intel Core i7处理器(4个支持多线程的内核)和Python 3.6.3结合使用。在Mac Os X Mojave上。
简而言之,我创建了一个虚拟的python脚本来重新创建该问题,它揭示了批处理大小为64,如果要花407秒用model.fit运行10个历元,用model.fit_generator花费1852秒,需要1985秒使用model.train_on_batch。 CPU负载分别为〜220%,〜130%和〜120%,尤其奇怪的是model.fit_generator和model.train_on_batch几乎相等,而model.fit_generator应该能够并行化微型批处理创建和模型。 train_on_batch绝对不会。也就是说,model.fit(具有巨大的内存需求)以易于管理的内存需求击败了其他候选解决方案四倍。显然,随着批次大小的增加,CPU负载增加,总训练时间减少,但是model.fit总是最快的,至少有两个裕度,直到8096。
这种行为是否正常(在不涉及GPU的情况下),或者为了提高内存较少选项的计算速度可以做什么?似乎没有这样的选项可用于将所有数据分为可管理的部分,然后以迭代方式运行model.fit。
cvfit = cv.glmnet(x, y, family = "binomial")
答案 0 :(得分:0)
model.fit -适用于将数据加载为numpy-array并进行训练而无需扩充的情况。
model.fit_generator -如果您的数据集太大而无法容纳在内存中,或者\并且您想即时应用增强。
model.train_on_batch -较少见,通常在一次训练多个模型(例如GAN)时使用