迁移学习(Transfer Learning)

1.定义

首先我们要清楚,机器学习中前提是训练数据和测试数据的分布是相同的。

在机器学习中,在实际的场景中,我们经常碰到的问题是标注数据的成本很高,如果我们要实现一个真实场景下完成一个目标任务,又势必需要大量的训练数据。

但是如果我们有一个相关任务已经有大量的训练数据,虽然这些训练数据的分布和任务不同,但是训练数据的规模比较大,我们就可以将此相关任务的训练数据中可泛化知识迁移到我们要实现的目标任务中,这就是迁移学习。 

迁移学习是指两个不同领域(源领域与目标领域)的知识迁移过程。被迁移的知识叫做源领域,源领域来帮助目标领域上的学习任务。源领域的训练样本数量一般远大于目标领域。

 2.迁移学习的目标

假设我们已经掌握了机器学习识别自行车,我们可不可以通过比较简单的方式让机器学习识别摩托车?这就是迁移学习的目标。

相比较我们日常生活,我们学会了c语言,那么再学习其他的编程语言,就相对轻松了不少。我们所要迁移学习实现的目标就是使得机器学习一项新的目标任务时更加轻松与快速,从而提高任务实现效率。

让机器学习站在巨人的肩膀上吧!

3.迁移学习的类型

归纳迁移学习

归纳迁移学习要求源领域和目标领域相关,并且源领域有大量的训练样本。

归纳迁移学习有两种迁移学习:

(1)基于特征:将预训练模型的输出或者中间隐藏层的输出作为特征直接加入到目标任务的学习模型中。一般来说,网络的低层学习一般处理比较通用的低层特征,中层或者高层处理一些高级语义特征,所以我们可以在最后几层学习与自己的目标任务相关的特征。

(2)精调:在目标任务上复用预训练模型的部分组件,对其参数进行调整。

转导迁移学习

转导迁移学习是从样本到样本的迁移,一般要求源领域有大量的标注数据,而目标领域没有(或少量)的标注数据,但是有大量的无标注数据。目标领域的数据在训练阶段是可见的。

无监督迁移学习

与归纳迁移学习有相似之处,但是常被用于目标任务中的无监督任务。

(我没有对此做出深刻思考与研究,需要的伙伴可以查找相关论文自行学习。)

4.pytorch--迁移学习--VGG16网络

首先要先导入预训练好的VGG16网络

vgg16=models.vgg16(pretrained=True)#导入vgg16网络
vgg=vgg16.features#获取vgg16网络的特征提取层
#对vgg16的特征提取层参数冻结,不对其进行更新
for param in vgg.parameters():
    param.requires_grad_(False)

下面定义网络,利用vgg16的特征提取层,然后自己加入新的全连接层,构成新的网络。

class MyVggModel(nn.Module):
    def __init__(self):
        super(MyVggModel,self).__init__()
        self.vgg=vgg#调用过来预训练的vgg16网络的特征提取层
        #添加新的全连接层
        self.classifier=nn.Sequential(
            nn.Linear(25088,512),
            nn.ReLU(),
            nn.Dropout(p=0.5),
            nn.Linear(512,256),
            nn.ReLU(),
            nn.Dropout(p=0.5),
            nn.Linear(256,10),
            nn.Softmax(dim=1)
        )
#前向传播
    def forward(self,x):
        x=self.vgg(x)
        x=x.view(x.size(0),-1)
        output=self.classifier(x)
        return output

查看网络的结构:

Myvggc=MyVggModel()
print(Myvggc)

输出:

MyVggModel(
  (vgg): Sequential(
    (0): Conv2d(3, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
    (1): ReLU(inplace=True)
    (2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
    (3): ReLU(inplace=True)
    (4): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
    (5): Conv2d(64, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
    (6): ReLU(inplace=True)
    (7): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
    (8): ReLU(inplace=True)
    (9): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
    (10): Conv2d(128, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
    (11): ReLU(inplace=True)
    (12): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
    (13): ReLU(inplace=True)
    (14): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
    (15): ReLU(inplace=True)
    (16): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
    (17): Conv2d(256, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
    (18): ReLU(inplace=True)
    (19): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
    (20): ReLU(inplace=True)
    (21): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
    (22): ReLU(inplace=True)
show more (open the raw output data in a text editor) ...

    (5): Dropout(p=0.5, inplace=False)
    (6): Linear(in_features=256, out_features=10, bias=True)
    (7): Softmax(dim=1)
  )
)

接下来大家就可以利用搭建好的新网络进行训练数据啦~~~

补充:vgg16网络的内部结构图(借鉴他人滴图图~~~)

  • 5
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值