前提:
在《python深度学习》第五章讲,使用预训练模型VGG16与自己的密集连接分类器结合时,讲了两种方法:
- 法一:用预训练模型的卷积基对数据集进行特征提取,生成原训练数据集的特征,这是我们训练分类器的训练集,这一步暂时称之为预特征提取。然后,基于预提取的特征训练最后的密集连接层分类器。
- 法二:在卷积基的基础上进行扩展,追加密集连接分类器,形成一个端到端的网络。然后在冻结卷积基的条件下,基于数据增强技术对整个模型进行训练。由于卷积基被冻结,其权重没有更新,所以卷积基的作用也仅仅是用于特征提取,但是它是在线(on-the-fly)进行的,所以这一步暂时称之为实时特征提取,以区别于上面的预特征提取。
- 原书中提到法一不能与数据增强技术结合使用,但是没有解释具体的原因。原因在于没有真正理解数据增强技术的处理过程。
解释:
-
这是因为:
- 在采用数据增强技术时,每一轮(epoch)训练所使用的样本不是完全一样的(虽然都是基于原始训练集进行变换而得);
- 而不采取数据增强时,每一轮(epoch)训练所使用的样本是完全一样的(可能只是使用的顺序不同,因为mini-batch生成的随机性)。
预特征提取是一次性地用卷积基对训练集进行特征提取,即便是这里使用了“数据增强”,生成的特征集(训练分类器的训练集)就不会再变化了。在后面训练中的每一轮(epoch)中都是使用相同的预提取特征(对应于使用相同的原始训练集)。
所以方法一(预特征提取)速度快,计算代价低,因为对于每一个数据样本只运行了一次卷积基,而卷积基的计算代价是远远大于最后的密集连接层的。而方法二(实时特征提取+数据增强)则是每一轮都要针对数据增强产生的不同的数据样本进行卷积基特征提取,因此其训练时的计算代价要远远大于方法一。
当然,有人解释了理论上方法一也是可以做到预特征提取与数据增强结合使用。那就是:假如你要训练M轮,原始样本集大小为N,则基于原始样本集利用数据增强技术先生成N∗M个样本。然后利用卷积基对这个大小为N∗M的增强数据样本集进行预特征提取。然后在后续的M轮训练,每一轮训练中从这N∗M个样本中无放回(without replacement)地采N个样本进行训练。这样做的效果就与方法二(实时特征提取+数据增强技术)完全一样了,计算量和训练效果都一样。但是这种做法就比方法二要麻烦多了,所以就没有什么实质性的意义,不如直接采用后者。