柠檬少年|迁移学习—通俗易懂地介绍(常见网络模型pytorch实现)( 二 )


这时, 迁移学习来拯救我了. 因为这个训练好的模型中已经有了一些对图片的理解能力, 而模型最后输出层的作用是分类之前的图片, 对于现在计算价值的任务是用不到的, #所以我将最后一层替换掉, 变为服务于现在这个任务的输出层. #接着只训练新加的输出层, 让理解力保持始终不变. 前面的神经层庞大的参数不用再训练, 节省了我很多时间, 我也在一天时间内, 将这个任务顺利完成.
柠檬少年|迁移学习—通俗易懂地介绍(常见网络模型pytorch实现)但并不是所有时候我们都需要迁移学习. 比如神经网络很简单, 相比起计算机视觉中庞大的 CNN 或者语音识别的 RNN, 训练小的神经网络并不需要特别多的时间, 我们完全可以直接重头开始训练. 从头开始训练也是有好处的.
柠檬少年|迁移学习—通俗易懂地介绍(常见网络模型pytorch实现)如果固定住之前的理解力, 或者使用更小的学习率来更新借鉴来的模型, 就变得有点像认识一个人时的第一印象, 如果迁移前的数据和迁移后的数据差距很大, 或者说我对于这个人的第一印象和后续印象差距很大, 我还不如不要管我的第一印象, 同理, 这时, 迁移来的模型并不会起多大作用, 还可能干扰我后续的决策.
迁移学习的限制比如说 , 我们不能随意移除预训练网络中的卷积层 。 但由于参数共享的关系 , 我们可以很轻松地在不同空间尺寸的图像上运行一个预训练网络 。 这在卷积层和池化层和情况下是显而易见的 , 因为它们的前向函数(forward function)独立于输入内容的空间尺寸 。 在全连接层(FC)的情形中 , 这仍然成立 , 因为全连接层可被转化成一个卷积层 。 所以当我们导入一个预训练的模型时 , 网络结构需要与预训练的网络结构相同 , 然后再针对特定的场景和任务进行训练 。
常见的迁移学习方式:

  1. 在权重后训练所有参数
  2. 在入权重后只训练最后几层参数
  3. 载入权重后在原网络基础上再添加一层全链接层 , 仅训练最后一个全链接层
衍生
柠檬少年|迁移学习—通俗易懂地介绍(常见网络模型pytorch实现)了解了一般的迁移学习玩法后, 我们看看前辈们还有哪些新玩法. 多任务学习, 或者强化学习中的 learning to learn, 迁移机器人对运作形式的理解, 解决不同的任务. 炒个蔬菜, 红烧肉, 番茄蛋花汤虽然菜色不同, 但是做菜的原则是类似的.
柠檬少年|迁移学习—通俗易懂地介绍(常见网络模型pytorch实现)又或者 google 的翻译模型, 在某些语言上训练, 产生出对语言的理解模型, 将这个理解模型当做迁移模型在另外的语言上训练. 其实说白了, 那个迁移的模型就能看成机器自己发明的一种只有它自己才能看懂的语言. 然后用自己的这个语言模型当成翻译中转站, 将某种语言转成自己的语言, 然后再翻译成另外的语言. 迁移学习的脑洞还有很多, 相信这种站在巨人肩膀上继续学习的方法, 还会带来更多有趣的应用.
使用图像数据进行迁移学习
  • 牛津 VGG 模型(~vgg/research/very_deep/)
  • 谷歌 Inception模型(models/tree/master/inception)
  • 微软 ResNet 模型()
可以在 Caffe Model Zoo()中找到更多的例子 , 那里分享了很多预训练的模型 。
实例:注:如何获取官方的.pth文件 , 以resnet为例子
import torchvision.models.resnet在脚本中输入以上代码 , 将鼠标对住resnet并按ctrl键 , 发现改变颜色 , 点击进入resnet.py脚本 , 在最开始有url , 如下图所示


推荐阅读