2.7 迁移学习(Transfer Learning)
Last updated
Last updated
训练集很小的情况:
建议:从网上下载一些神经网络开源的实现,不仅把代码下载下来,也把权重下载下来。然后去掉Softmax层,创建自己的Softmax单元,用来输出Tigger、Misty和neither三个类别。把所有的层看作是冻结的,冻结网络中所有层的参数,只需要训练和Softmax层有关的参数。这个Softmax层有三种可能的输出,Tigger、Misty或者Neither。
通过使用其他人预训练的权重,很可能得到很好的性能,即使只有一个小的数据集。大多数深度学习框架会有trainableParameter=0
的参数,对于前面的层,可以设置这个参数。为了不训练这些权重,会有freeze=1
的参数。只需要训练softmax层的权重,把前面这些层的权重都冻结
由于前面的层都冻结了,相当于一个固定的函数,因此不需要改变和训练它,取输入图像,然后把它映射到softmax前一层的激活函数。能加速训练的技巧是如果先计算这一层(紫色箭头标记),计算特征或者激活值,然后把它们存到硬盘里。所做的就是用这个固定的函数,在这个神经网络的前半部分(softmax层之前的所有层视为一个固定映射),取任意输入图像,然后计算它的某个特征向量,这样训练的就是一个很浅的softmax模型,用这个特征向量来做预测。对计算有用的一步就是对训练集中所有样本的这一层的激活值进行预计算,然后存储到硬盘里,在此之上训练softmax分类器。存储到硬盘或者说预计算方法的优点是不需要每次遍历训练集再重新计算这个激活值
更大的训练集:应该冻结更少的层,然后训练后面的层。如果输出层的类别不同,那么需要构建自己的输出单元,Tigger、Misty或者Neither三个类别。可以取后面几层的权重,用作初始化,然后从这里开始梯度下降
也可以直接去掉这几层,换成自己的隐藏单元和softmax输出层,如果有越来越多的数据,那么需要冻结的层数就越少,能够训练的层数就越多。如果有一个更大的数据集,那么不要单单训练一个softmax单元,而是考虑训练中等大小的网络,包含最终要用的网络的后面几层
如果有大量数据:应该做的就是用开源的网络和它的权重,把所有的权重当作初始化,然后训练整个网络
如果有越多的标定的数据,可以训练越多的层。极端情况下,可以用下载的权重只作为初始化,用它们来代替随机初始化,接着用梯度下降训练,更新网络所有层的所有权重