假设我有 10K 大小的图像训练一个 CNN。
如何在不下采样的情况下处理如此大的图像尺寸?
这里有几个更具体的问题。
是否有任何技术来处理要训练的如此大的图像?
使用什么批量大小是合理的?
是否有任何预防措施,或者我可以做的硬件资源的增加和减少?
以下是系统要求
Ubuntu 16.04 64-bit
RAM 16 GB
GPU 8 GB
HDD 500 GB
假设我有 10K 大小的图像训练一个 CNN。
如何在不下采样的情况下处理如此大的图像尺寸?
这里有几个更具体的问题。
是否有任何技术来处理要训练的如此大的图像?
使用什么批量大小是合理的?
是否有任何预防措施,或者我可以做的硬件资源的增加和减少?
以下是系统要求
Ubuntu 16.04 64-bit
RAM 16 GB
GPU 8 GB
HDD 500 GB
如何在不下采样的情况下处理如此大的图像尺寸?
我假设通过下采样意味着在将输入传递到 CNN之前按比例缩小输入。卷积层允许通过选择较大的步幅来对网络中的图像进行下采样,这将为下一层节省资源。事实上,这就是它必须做的,否则你的模型将不适合 GPU。
- 是否有任何技术来处理要训练的如此大的图像?
通常研究将图像缩放到合理的大小。但如果这不是你的选择,你需要限制你的 CNN。除了在早期层进行下采样外,我建议您摆脱 FC 层(通常采用大部分参数)以支持卷积层。此外,您还必须在每个时期流式传输您的数据,因为它不适合您的 GPU。
请注意,这些都不会阻止早期层的繁重计算负载,这正是因为输入如此之大:卷积是一项昂贵的操作,并且第一层将在每次前向和后向传递中执行大量此类操作。简而言之,训练会很慢。
- 使用什么批量大小是合理的?
这是另一个问题。单个图像需要2400x2400x3x4
大约 70Mb(每个像素 3 个通道和 4 个字节),因此即使批量大小为 10 也几乎无法承受。更现实的是 5。请注意,大部分内存将由 CNN 参数占用。我认为在这种情况下,通过使用 16 位值而不是 32 位来减小大小是有意义的——这样你就可以将批次加倍。
- 是否有任何预防措施,或者我可以做的硬件资源的增加和减少?
您的瓶颈是 GPU 内存。如果你能买得起另一个 GPU,那就买它并在它们之间拆分网络。与 GPU 内存相比,其他一切都微不足道。
通常对于图像,特征集是像素密度值,在这种情况下,它将导致相当大的特征集;也不建议对图像进行下采样,因为您可能会丢失(实际上会)丢失重要数据。
[1] 但是有一些技术可以帮助你减少特征集的大小,像 PCA(主成分分析)这样的方法可以帮助你选择重要的特征子集。
有关详细信息,请参阅链接http://spark.apache.org/docs/latest/ml-features.html#pca。
[2] 除了在训练神经网络时减少计算费用之外,您还可以使用随机梯度下降,而不是传统的梯度下降方法,这将减少每次迭代训练所需的数据集大小。因此,在一次迭代中使用的数据集大小会减少,从而减少训练网络所需的时间。
要使用的确切批次大小取决于您对训练数据集和测试数据集的分布,更一般的用途是 70-30。您还可以使用上述随机方法来减少所需时间。
随机梯度下降的详细信息http://scikit-learn.org/stable/modules/sgd.html
[3] 硬件似乎需要升级,但如果需要,请查看 AWS 等云解决方案,您可以获得免费帐户订阅,直至使用限制。
如此大的数据无法加载到您的内存中。让我们把你能做的事情分成两部分:
将所有图像重新缩放为更小的尺寸。您可以将它们重新缩放为 112x112 像素。在您的情况下,因为您有一个方形图像,所以不需要裁剪。您仍然无法将所有这些图像加载到您的 RAM 中。
最好的选择是使用生成器函数来批量提供数据。请参考 Keras 中使用fit_generator的用法。如果您的模型参数变得太大而无法放入 GPU 内存,请考虑使用批量归一化或使用残差模型来减少参数数量。