内存需求

​CNN 的另一个问题是卷积层需要大量的 RAM,特别是在训练期间,因为反向传播需要在正向传递期间计算的所有中间值。

​例如,考虑具有5×5卷积核的卷积层,输出 200 个尺寸为150×100的特征映射,步长为 1,使用SAME填充。 如果输入是150×100RGB 图像(三个通道),则参数的数量是(5×5×3 + 1)×200 = 15,200+1对应于偏置项),这跟全连接层比较是相当小的。(具有150×100神经元的全连接层,每个连接到所有150×100×3输入,将具有150 ^ 2×100 ^ 2×3 = 675,000,000个参数!)然而,200 个特征映射中的每一个包含150×100个神经元,并且这些神经元中的每一个都需要计算其5×5×3 = 75个输入的权重和:总共 2.25 亿次浮点乘法。不像全连接层那么糟糕,但仍然是计算密集型的。 而且,如果使用 32 位浮点数来表示特征映射,则卷积层的输出将占用 RAM 的200×150×100×32 = 9600万位(大约 11.4MB)。 这只是一个例子! 如果训练批次包含 100 个实例,则该层将占用超过 1 GB 的 RAM!

​在推理过程中(即对新实例进行预测时),一旦下一层计算完毕,一层所占用的 RAM 就可以被释放,因此只需要两个连续层所需的 RAM 数量。 但是在训练期间,在正向传递期间计算的所有内容都需要被保留用于反向传递,所以所需的 RAM 量(至少)是所有层所需的 RAM 总量。

如果由于内存不足错误导致训练崩溃,则可以尝试减少小批量大小。 或者,您可以尝试使用步幅降低维度,或者删除几个图层。 或者你可以尝试使用 16 位浮点数而不是 32 位浮点数。 或者你可以在多个设备上分发 CNN。