CNN 的基本结构是由卷基层和全连接层构成的. 对于在大规模数据集(例如ImageNet)上训练好的网络, 我们可以利用它的权重来帮助我们实现我们的任务.从原理上来讲,随机初始化容易将网络导向不确定的局部最优, 因此一般需要利用多次随机初始化训练来验证结果的有效性. 而借助已训练好的网络或者说利用已训练好的的网络权重作为网络初始值已被广泛证明有利于网络以较快的速度趋于最优化(transfer learning).这样做的原理往往是说不清楚的, 但是不乏附会的理由. 这里我们不纠结那些, 只来考虑如何用已训练好的网络来进行fine-tune已适应我们自己的数据.
借助已训练好的网络, fine-tune我们自己的数据. 这里分两种情况:
- A. 我们的输入和网络原始输入一致(尺寸)
- 原始网络结构(除了输出层class的个数可能有差异)外, 我们可以完全接管过来.
- B. 我们的输入尺寸和网络原始输入尺寸有差异
- 原始网络的输入层和输出层我们都需要进行改造以处理我们自己的数据. 因为在网络确定的情况下,全连接层的参数规模和结构由输入尺寸决定. 因此输入层和原始网络不一样, 那么原始网络全连接层的权重(具体来说是最后一个卷基层和第一个全连接层处的权重)因参数尺寸不一样,我们用不了. 因此在输入尺寸有变化时,原始网络全连接层的权重就不能用了.
fine tune 的方法
网络整体利用新数据重新训练,所有层都是trainable的.
1 对于情况A, 权重(在输出类别个数改变的情况下,除了最有一层外,其余层的权重都可以直接调用原始网络的)可以调用原始网络的. 然后在原始网络上直接重新进行训练.
2 对于情况B, 卷积层的权重可以直接调用原始网络, 全连接层的权重可以:
2.1. 随机初始化,然后整体一起训练.
2.2. 先freeze卷基层, 用我们的数据训练一下随机初始化的全连接层,然后将训练好的全连接层和卷基层拼在一起,整体重新训练.
局部训练
- 卷基层freeze, 全连接层进行训练.
卷基层freeze, 随机初始化全连接层,然后用我们自己数据重新训练全连接层.
这里的卷基层相当于特征提取层, freeze的目的是为了保留它之前的特征提取能力.