我找到了一张表格,描述了Keras.Applications模块支持的每个模型的大小、深度和参数数量(https://keras.io/applications/中的“各个模型的文档”)。我想根据模型的准确性与可能的训练时间来选择模型。
我认为参数数量直接影响训练时间,因为参数越多,梯度下降的计算难度就越大。但有些模型,特别是VGG16,参数很多但深度很低。或者DenseNet121和Xception,它们的深度非常相似,但参数数量和MB大小却大不相同。
大小和深度是否也影响训练时间?如果是,以什么方式影响?训练时间是否与参数数量成线性关系?
回答:
深度影响较小,但参数数量非常重要,你没有提到的一点是,输入的大小也非常重要。
首先,如果你在使用视觉网络,那么你可能有许多卷积层。如果你将一个300 x 300的图像输入到网络中,假设第一层是一个步长为2、输出通道为100的3 x 3卷积核,那么网络将在整个图像上运行300 x 300的卷积核,前向传播需要进行150 x 150 x 3 x 3 x 100 = 20,250,000次计算,尽管一个3 x 3卷积核只有9个参数,但对于100个输出通道来说,你有900个参数,这是一个很小的数字。
不同层也有不同的计算需求。例如,dropout层非常便宜。logit或softmax则要昂贵得多。批量归一化也会增加很多计算量,因为它需要计算激活的标准偏差,这需要大量的平方运算。Relu再次说明,非常便宜,它的发明是2014年计算机视觉突破的主要因素之一。可以这样想:加法非常便宜。乘法便宜。涉及对数或指数运算的任何东西都很昂贵。(如果作为乘法进行,平方可以便宜。)梯度计算是基于取导数进行的,所以对于前向传播的任何操作,也要考虑它的导数,因为这将决定反向传播的时间需求。
训练时间的估计更加棘手,因为一套调优的超参数(学习率、学习率退火等)对其有很大影响,不同的架构对它们的优化点也不相同。
此外,这一切都假设网络下的基础设施不是瓶颈。如果你无法从磁盘(或内存,如果你有足够的内存,并预取和缓存数据)中快速获取输入,或者PCI-E总线无法快速处理数据传输(特别是在多GPU环境中),那么这也会对训练时间产生不利影响。如果你使用的是云服务,你甚至可能不知道它是如何设置的。
总的来说,我希望我提供了一些指导。但我担心除了某些非常明确的情况外,我无法真正帮你避免实验的麻烦。