在弗朗索瓦·肖莱(Keras的创造者)所著的《用Python进行深度学习》一书中,第5.3节(见配套Jupyter笔记本),我对以下内容感到困惑:
让我们通过使用在ImageNet上训练的VGG16网络的卷积基础来提取我们的猫和狗图片中的有趣特征,并在此基础上训练一个猫与狗分类器,来实践这一点。
[…]
我们可以采取两种方式进行操作:
- 在我们的数据集上运行卷积基础,将其输出记录到磁盘上的Numpy数组中,然后使用这些数据作为独立的全连接分类器的输入,就像你在本书前几章看到的那样。这种解决方案运行速度非常快且成本低,因为它只需要对每张输入图片运行一次卷积基础,而卷积基础是整个流程中最昂贵的部分。然而,正是由于同样的原因,这种技术完全无法利用数据增强。
- 通过在我们现有的模型(conv_base)上添加Dense层来扩展它,并在输入数据上端到端运行整个模型。这允许我们使用数据增强,因为每次模型看到输入图片时,它都会通过卷积基础。然而,正是由于同样的原因,这种技术比第一种方法昂贵得多。
为什么我们不能对数据进行增强(从现有数据生成更多图片),在增强后的数据集上运行一次卷积基础,记录其输出,然后将这些数据作为独立的全连接分类器的输入呢?
这不应该能得到与第二种替代方案相似的结果,但速度更快吗?
我错过了什么吗?
回答:
这不应该能得到与第二种替代方案相似的结果,但速度更快吗?
结果相似是的,但真的会更快吗?
肖莱在这里的主要观点是,第二种方法仅仅由于数据增强过程本身导致的图片数量增加而变得更加昂贵;而第一种方法
只需要对每张输入图片运行一次卷积基础
在第二种方法中
每次模型看到输入图片时,它都会通过卷积基础 […] 正是由于同样的原因,这种技术比第一种方法昂贵得多
因为
卷积基础是整个流程中最昂贵的部分
这里的“每次模型看到输入图片时”必须理解为“在数据增强过程产生的每个版本中”(同意,这里的话应该可以更清楚…)。
使用你提出的方法无法绕过这一点。这确实是第二种方法的一个有效替代版本,但考虑到整个端到端过程(CNN+FC)在两种情况下,没有理由认为它会真正更快…
更新(在评论后):
也许你是对的,但我仍然感觉错过了什么,因为作者明确指出第一种方法“完全无法利用数据增强”。
我认为你在这里只是过度解读了——虽然,同样,作者可以并且应该更清楚;如文所述,肖莱的论点在这里有些循环(我们中最好的人也会这样):由于我们只对“每张输入图片运行一次卷积基础”,结果按定义我们没有使用任何增强…有趣的是,书中的这句话(p. 146)略有不同(不那么戏剧化):
但由于同样的原因,这种技术不会允许你使用数据增强。
那个原因是什么呢?当然是因为我们只将每张图片输入卷积基础一次…
换句话说,实际上并不是我们“被允许”不这样做,而是我们选择不进行增强(为了更快,也就是说)…