深度学习 转移学习的项目实践-1

Transfer_learning背景知识介绍

  1. 介绍

简单地说,转移学习是“利用通过对一项任务进行训练获得的神经网络架构与属性应用于另一项任务。”
根据应用程序的不同,可以采用不同的策略来执行迁移学习。
例如,如果目标是构建一个图像分类应用程序,其中要分类的目标图像与已建立的数据集中的图像相似。我们就可以在这些数据集上使用预先训练过的神经网络模型进行训练,而不是从头开始。

在keras中我们可以用许多它提供的已经训练好CNN模型例如:

  1. VGG16,
  2. VGG19
  3. Inception V3
  4. ResNet50
  5. MobileNet
    这些模型具体的准确率如下图所示我们可以去keras官网了解更详细的参数:
    在这里插入图片描述
    2.策略

迁移学习主要有两种方式:
1)特征提取(feature extractor)也称冻结(frezzing):
导入已经训练好的模型的权重与训练参数并冻结
(冻结指参数保持不变,不参加训练),只根据此次要训练的数据class类别数更改最后全连接网络输出层的参数。
2) 调整(fine tune):
微调意味着允许weight的更新。只冻结模型最开始对general 特征的训练权重以及参数,根据情况调节后面层的参数并进行适当的更改。这样的好处是这些层现在将用预先训练好的神经网络模型的权值进行初始化,而不是从一些随机初始化器/零的权值开始。这很重要,因为正确的权值集会影响收敛,而如果从零开始训练网络,则不会出现这种情况。

  1. 应用情况

所以什么时候用特征提取,什么时候用微调的方法呢?针对新的待训练的数据集的不同一般有以下几种情况:

1)当新的数据集比较小且和原数据集相似时采用特征提取的方法。因为新数据集比较小(比如<5000),如果fine-tune可能会过拟合;又因为新旧数据集类似,我们期望他们高层特征类似,可以使用预训练网络当做特征提取器,用提取的特征训练线性分类器。

2)新数据集大且和原数据集相似时采用调整的方法。因为新数据集足够大(比如>10000),可以fine-tune整个网络。

3)新数据集小且和原数据集不相似。新数据集小,最好不要fine-tune,和原数据集不类似,最好也不使用高层特征。这时可使用前面层的特征来训练SVM分类器。

4)新数据集大且和原数据集不相似。因为新数据集足够大,可以重新训练。但是实践中fine-tune预训练模型还是有益的。新数据集足够大,可以fine-tine整个网络。

项目介绍

利用transfer_learning技术对给定的四类图像数据集合进行分类识别训练,并进行调优。

数据集合

图像数据目录已经处理和分类好四类类图像数据(cat,dog,car,motorbike)
数据集来自Kaggle: https://www.kaggle.com/c/dogs-vs-cats/data.

图像数据分类处理

图像数据的分类处理示例代码如下。因为数据都存在一个文件夹下,为了适应keras的模型训练需要的数据格式,需要将图像按照类别分别存储在对应的子文件夹中。
示例代码完成的内容:

选取Kaggle数据集合的2000张猫和狗的图片,1000 张用来训练,500张用来验证,剩下500张用来测试。因为在接下来的图像处理中我们需要采用keras的ImageData Generator 来实时分批处理图像数据。而ImageData Generator对输入的数据格式有要求。所以现在我们就要先把图像整理成要求的格式,即将训练,测试,验证数据集分成k个子目录,k是图像的类别数。每个子目录下应该根据类别存放对应的图片。

# we assume the filenames of all images with cats (resp.dogs) are cat.i.jpg, where i is an integer.

import os, shutil
#创建好分类目录
base_dir = '../dogs-vs-cats'
original_dir='../dogs-vs-cats/trainAll'
train_dir = os.path.join(base_dir, 'trainS') 
val_dir = os.path.join(base_dir, 'valS') 
test_dir = os.path.join(base_dir, 'testS')

train_cats_dir=os.path.join(train_dir, 'cats')
train_dogs_dir=os.path.join(train_dir, 'dogs')
test_cats_dir=os.path.join(test_dir, 'cats')
test_dogs_dir=os.path.join(test_dir, 'dogs')
val_cats_dir=os.path.join(val_dir, 'cats')
val_dogs_dir=os.path.join(val_dir, 'dogs')
#the following script copy the first 1000 cat images to the training directoy. 
fnames = ['cat.{}.jpg'.format(i) for i in range(1000)]
for fname in fnames
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值