一/为什么会有迁移学习:
在模型的训练过程中, 当你有充分的数据时, 你可以将你的网络随机初始化, 进行从头的训练参数过程, 但这个过程可能很长和很痛苦;
因为模型的前几个层中, 主要学习到的特征是图像的轮廓, 或其他特征, 在在最后的几层才是分类或回归的高级特征,
因此人们往往利用别人已经训练好的模型,而修改最后几层,来达到自己的目的, 而且只训练最后几层, 你的要求训练集会很小。
个人感觉迁移学习的好处:
借用别人的训练参数, 节省训练时间;
可减少自身项目中对图片训练集的要求。
二、那么进行迁移学习时: 如何设置caffe中的模型呢?
这分为2个情况:
2.1 假设有A B C 三个层, 你只想训练C层, 而A和B 不动, 那么你需要设置C层网络的参数 propagate_down; 这个参数的作用是,阻止反向传播向前传播, 不传播了,自然A和B的参数不会被修改。 看一下caffe代码中的解释:
// Specifies whether to backpropagate to each bottom. If unspecified,
// Caffe will automatically infer whether each input needs backpropagation
// to compute parameter gradients. If set to true for some inputs,
// backpropagation to those inputs is forced; if set false for some inputs,
// backpropagation to those inputs is skipped.
//
// The size must be either 0 or equal to the number of bottoms.
repeated bool propagate_down = 11;
情况二:
2.2 你想训练A和C层, 而只有B层不训练, 则, 你需要将B层的参数, 步长系数 lr_mult: 设置为0, 这样,在这个层中, 返回来的梯度该变量与0 相乘, 则该层的参数不会改变,而继续向前传播到A层。