2.7 迁移学习(Transfer Learning)
训练集很小的情况:
建议:从网上下载一些神经网络开源的实现,不仅把代码下载下来,也把权重下载下来。然后去掉Softmax层,创建自己的Softmax单元,用来输出Tigger、Misty和neither三个类别。把所有的层看作是冻结的,冻结网络中所有层的参数,只需要训练和Softmax层有关的参数。这个Softmax层有三种可能的输出,Tigger、Misty或者Neither。
通过使用其他人预训练的权重,很可能得到很好的性能,即使只有一个小的数据集。大多数深度学习框架会有trainableParameter=0
的参数,对于前面的层,可以设置这个参数。为了不训练这些权重,会有freeze=1
的参数。只需要训练softmax层的权重,把前面这些层的权重都冻结
更大的训练集:应该冻结更少的层,然后训练后面的层。如果输出层的类别不同,那么需要构建自己的输出单元,Tigger、Misty或者Neither三个类别。可以取后面几层的权重,用作初始化,然后从这里开始梯度下降
也可以直接去掉这几层,换成自己的隐藏单元和softmax输出层,如果有越来越多的数据,那么需要冻结的层数就越少,能够训练的层数就越多。如果有一个更大的数据集,那么不要单单训练一个softmax单元,而是考虑训练中等大小的网络,包含最终要用的网络的后面几层
如果有大量数据:应该做的就是用开源的网络和它的权重,把所有的权重当作初始化,然后训练整个网络
如果有越多的标定的数据,可以训练越多的层。极端情况下,可以用下载的权重只作为初始化,用它们来代替随机初始化,接着用梯度下降训练,更新网络所有层的所有权重
Last updated