第10章 迁移学习 transfer learning,混合模型(监督学习+无监督学习、机器学习+深度学习),两个实战


目录


一、本章内容

1.1 五个部分

1.2 第8章回顾:猫狗识别:卷积神经网络CNN

1.

2.结果

在同等的计算机硬件条件下:
4000张图片;—>420张图片;

结果:相比于重建全新的CNN模型,基于VGG16+MLP的结构,效果却好很多。

3.启发

在已训练好的高质量的模型基础上,继续推进,事半功倍。

大冰:

学会借力。

我:

站在巨人的肩膀的。

所以,迁移学习,应运而生。

二、迁移学习 transfer learning

2.1 定义:将某领域知识,应用到其他不同但相关的领域

2.2 生活举例:学骑自行车-->学骑摩托车;汽车识别-->卡车识别

2.3 前后两个模型之间的关系图示

2.4 三种迁移学习的方式:特征提取、结构引用、部分训练

一,

1.只提取原模型A的特征;

2.全部使用原模型A;+新数据,二次训练(对所有层的神经元进行重新训练、更新权重系数)。

3.全部使用原模型A;+新数据,部分训练(冻结前两层神经元,只训练后两层神经元、更新权重系数).

二,

具体使用上述三种方式中的哪一种?

根据任务的相似度、数据量大小,来根据情况灵活调整。。。下面只是参考,不是一定必须。

注意:左上角的“全新模型”,指的是,与模型A无关,直接新建一个模型B即可。

因为:不符合迁移学习中“不同但相关的领域”的前提。

2.5 优势:不需要很多样本数据量,但效果却更好

不需要很多的样本数据量,但效果却更好。

2.6 在线学习

1.

跟上面迁移学习中,的第二种情况:结构引用,很相似。

结构引用:全部使用模型A;+新数据,二次训练(对所有层的神经元进行重新训练、更新权重系数)

场景:因为总有新数据,源源不断的产生。

求解原理:采用线性回归、逻辑回归中的,梯度下降法。

2.例子

3.学习资料

1、Introduction to Online Machine Learning: Simplified:
https://www.analyticsvidhya.com/blog/2015/01/introduction-online-machine-learning-simplified-2/

2./What is online machine learning:
https://medium.com/value-stream-design/online-machine-learning-515556ff72c5
在线学习,没咋懂。感觉也不重要

2.7 课后题

CAF EBGD

三、混合模型:半监督学习

上节:介绍了迁移学习,它可以在数据样本量比较少的情况下,来完成出色的预测任务。

本节:

  • 问题:如果样本量更少,且样本类别无法穷尽,那么迁移学习,就会失效。
  • 解决:混合模型,应运而生。

3.1 数据决定模型表现的上限

1.

高质量数据的三个标准;------------------------- 现实中大部分却是普通数据

2.例子

太阳能电池板的表面,图片检测:

划痕、斑痕,的出现位置、角度,是随机的。

.png)

3.例子

其他苹果:指的是其他品种的苹果、有缺陷的苹果。

问题:30个苹果中,只有10个苹果有标签。有标签的苹果都是普通苹果,即只是一个类别的。

也就是说,没有办法,穷尽负样本的类别。------------------------------ 不懂?

3.2 半监督学习:Semi-Supervised Learning,监督学习+无监督学习

现实中,对图片打标签,会耗费很多的人力。而且,打出来的标签,也不一定准。

该模型,也是尽可能的,将未标记样本中的有价值信息,提取出来。

3.3 伪标签:自动打了标签的无标签数据

伪标签:是半监督学习中,最常用的方法。

1.

(1)先基于有标签数据1,来进行第一次模型训练。

(2)将上述模型,应用到无标签数据上,来产生一些伪标签;

从上述伪标签中,基于一定规则,来挑选出数据:分类正确的无标签数据2

(3)再次,基于标签数据1 + 分类正确的的无标签数据2,进行第二次的模型训练。

上述第二步,可以理解为,将无标签数据,来自动的打标签。

2.

如果只是根据有标签数据,来进行二分类,比如逻辑回归,那么分类的结果就如同下图(a)中的垂直红线。效果不好。

下面,是尝试使用伪标签:效果很好。

从上述伪标签中,基于一定规则,来挑选出数据:分类正确的无标签数据2

这里的规则:指的是对于红点或黑点,距离d范围内的其他灰点。

3.4 方式2:伪标签的第二步,也可使用聚类来自动分类

1.

第二步:从上述伪标签中,基于一定规则,来挑选出数据:分类正确的无标签数据2

有时候,这个规则找起来,会很难。

2.

第二步,还可以用其他的方式。比如:
无监督的聚类算法。(第四章)。同上面的方式,得到的最终分类效果一样。

3.5 方式3:从有标签数据中,提取特征,来应用到无标签数据中

从有标签数据中,提取特征,来应用到无标签数据中。

有标签数据:自己手里的数据;他人的类似数据或模型;

这不是上节的迁移学习吗?

四、混合模型:机器学习+深度学习

4.1 机器学习+深度学习,应用的组合(总图)

1.

机器学习+深度学习的应用之一:聚类。

2.

机器学习+深度学习的其他应用:

数据预处理方面:

  • 数据降维:PCA主成分分析(机器学习 第5章)
  • 异常检测:(机器学习 第5章)

任务模型:

  • 聚类任务(机器学习 第4章)
  • 分类任务(机器学习 第3章)
  • 回归任务(机器学习 第2章)

深度学习:

  • 多层感知器 MLP (深度学习 第7章)
  • 卷积神经网络 CNN (深度学习 第8章)
  • 循环神经网络 RNN (深度学习 第9章)

4.2 监督、无监督、机器、深度,的灵活组合

随机的搭积木。

机器学习,用来进行数据预处理,以及根据任务来确定和建立模型。

深度学习,用来提取一些复杂的特征;

监督学习与否:根据数据样本的类型,来搭建不同的模型。

下图:

  • (a)不用深度学习。
  • (b)比如,第8章 实战:基于VGG16+MLP的猫狗识别
  • (c)全用。比如,本章第10章 实战:异常苹果检测。10个有标签的苹果(监督学习),20个无标签的苹果(无监督学习),进行自动聚类。然后,用有标签的苹果,来进行结果矫正。数据维度的缩减(PCA),还用到VGG16.

4.3 课后题

相对比较棘手的任务,以后工作或生活中,会遇到:

五、实战准备

迁移学习、混合模型。

能够在数据量比较少、或标签数据有限的情况下,来建立有效的模型,来完成预测任务。

5.1 实战(一):基于新数据的迁移学习预测

迁移学习:实现model1到model2的转换

1.

因为是回归任务,所以用linear的激活函数(输出层);

下面是MLP模型。(其实自己用下逻辑回归模型,效果也不错)

2.核心代码

因为是回归任务,且是一维的x输入,所以input_dim为1;

模型的迁移:

加载已训练好的模型。通常是保存在本地。

dump:倾倒;垃圾

dunk:

5.2 实战(二):寻找普通苹果与其他苹果

1. 任务

1.

30张苹果图片:

  • 13张是普通苹果(只有10张有标签)
  • 其他的17张,是其他苹果(异常苹果)

2.

左边是:测试数据集;

任务拆分:

  • 因为带标签的数据,非常好(只有13张)。所以,需要扩充。
  • 特征提取。第8章 卷积神经网络时,讲过;
  • 先用Kmeans模型(逻辑回归中的第一个模型);
  • 再用meanshift模型试下;
  • 因为一张图片可以理解为200*200,有4万个输入,这个输入里面可能会有噪音。所以,可以通过数据降维,将主要信息保留下来。

2. 数据增强,用于扩充样本的数量

数据增强。卷积神经网络时提过。这里详细介绍下。

  • 这个类ImageDataGenerator用来生成新图片的;
  • path:文件夹里,需要有一个子文件夹。因为要对这个子文件夹中,产生新的图片。

创建图片实例:

  • 10的意思是:在0-10°之间,进行随机的旋转;
  • 0.1的意思是:相对于原图片,水平移动的比例是10%;
  • 0.02的意思是:相对于原图片,垂直移动的比例是2%;
  • 水平旋转、垂直旋转。

配置图片增强的参数:

  • target_size指的是生成的图片的像素,是224*224。因为这是VGG16进行轮廓提取需要满足的尺寸。
  • 产生的图片的组数,是batch_size。
  • 所存储的图片,增加的前缀,是gen;
  • 存储的格式,是jpg;

因为一次会生成2张图,这里有100次,所以一共会生成200张新图片。

3. 单张图片的加载、可视化

先将图片,转换为一个Numpy中的数组;

然后,将这个数组,给到VGG16的模型,进而去提取其核心特征。

4. 加载VGG16模型,对单张图片进行特征提取

不需要输出层,只需要前面那些提取特征的核心层;

对图片,进行维度的转换,让其能够直接应用到VGG16的模型;

讲过下面处理之后,这样以后逻辑回归(kmeans或meanshift)模型,衔接起来。

5. 批量图片处理:路径加载、路径合成

6. 定义一个提取图片特征的方法,用于批处理

features的变量,是一个数组array,里面的元素都是0。如果一共有100张图片,那么该数组就有100行。那么,列数就是VGG16处理完图片时展开的列数,是一样的。

已完成了对所有图片的加载、特征提取的工作。

7. 模型的建立:kmeans模型、meanshift模型

kmeans模型:

因为我只知道正样本只有1类,但是负样本有几类,是不知道的。

这里假设,所有的负样本都是归为1类。所以,这里的n_cluster是2.

meanshift模型:

不需要指定要分多少类。

一共有200-250张左右的图片。其70%的数量,就是140张。(当然,也可以是150,问题不大)

flare老师:

机器学习、深度学习中,建模、训练是比较简单的。

更重要的工作,其实是前面的数据预处理。(验证了,数据质量决定了模型表现的上限。)

所以,有时候最后的模型的效果不好,极大可能是因为数据的预处理工作,做的不好。

8. 数据降维 PCA

200*200那就是40000的维度。里面的噪音处理,那就是数据降维。

尝试降到200个维度。看一下主成分呢的方差比例,是多少。

9. 统计一共有多少个类别,及其出现次数

统计出y_pred_ms里,一共有多少个类别,每个列别出现了多少次。

六、实战(一):基于新数据的迁移学习预测

6.1 任务

任务:基于transfer_data.csv数据,建立mlp多层感知器(神经网络,深度学习),再实现模型的迁移学习;
1.实现x对于y的预测,可视化结果;
2.基于新数据transfer_data2.csv,对前模型进行二次训练,对比模型训练次数少的情况下的表现;

备注:模型结构:mlp,两个隐藏层,每层有50个神经元,激活函数是relu;输出层的激活函数是linear,迭代次数是100次

数据集,长下面这样:

6.2 task1:建立建立mlp多层感知器模型,实现x对于y的预测,可视化结果

1.

加载数据集,并赋值X、y;

然后,可视化下:

2.

转换数据类型、数据维度:

  • 由原来的Pandas库中的一个Series数据类型,转换为Numpy库中的数组Array;
  • 上面这个刚由series转换后的数组array,默认是一维的。所以,还需要将其转换为二维,n行1列。

3.

在本任务中,建立MLP模型来拟合这个点。(感兴趣的话,也可以通过多项式函数,来回归预测)

先训练个100次:

结果:

基本的形状已有,但是拟合的效果还不是太好。

4.

再训练100次,发现:
拟合效果,好了不少。

5.

再训练200次,发现:
拟合效果,已最好。

6.3 task2:基于新数据transfer_data2.csv,对前模型进行二次训练,对比训练次数少的情况下的表现

1.

模型的存储:在进行第二个模型之前,需要将第一个模型保存下来。保存到本地电脑。

模型的加载:将本地模型,加载进本项目中:

其中,模型已成功保存:

问题:

解决:

参考:https://www.geeksforgeeks.org/how-to-fix-importerror-cannot-import-name-joblib-from-sklearn-externals/

安装成功:

2.

X2的维度转换:先从pandas库中的series数据类型,转换成数学里的数组array类型;(丢弃索引index)(只是101行的数据)

先看一下转换之前的X2、y2的类型、样子:

这里的(101,),指的是一维数组,有103个数据。

再reshape;

下图中,(101,) 与 (101, 1) 的区别是:

  • (101,)指的是:1维数组。里面有101个元素。
  • (101, 1)指的是:2维数组。里面有1个元素,每个元素是101行1列。
  • 如果是,(6,101,1)指的是:3维数组。里面有6个元素,每个元素都是101行1列。

关于numpy库中数组,补充:

.png)

3.

如果不进行迁移学习,看下效果:

4.迁移学习:

(1)用新数据,先训练10次:

结果如下:

(2)再训练10次:

结果如下:

(3)再训练20次:

结果如下:

上节中,重新建立模型的方式,为了达到好的效果,一共迭代了400次。

本节,通过迁移学习的方式,达到同样的好效果,只需40次。

好处:就是如果任务量非常大时,会节约很多时间。或者,对计算机性能的配置要求,会大幅降低。

6.4 小结

七、实战(二):寻找普通苹果与其他苹果

7.0 任务

本实战的特点:看起来简单,但是最终效果总是不太好。

数据的特点:

  • 样本少:只有30张图片;
  • 部分标注(且都是正样本):只有1/3(10个)样本,是标注了的。
  • 负样本类别不可穷尽:其他苹果,的类别都是不一样的,奇形怪状都会有

任务的特点:运用的技术比较综合、实用。比如,监督学习,机器学习,深度学习

任务:根据original_data样本,建立模型,对test_data的图片进行普通/其他苹果的判断;
1.数据增强,扩充确认为普通苹果的样本数量;
2.数据提取,使用VGG16模型来提取图像特征;
3.图片的批量处理;
4.Kmeans模型,尝试普通、其他苹果的聚类
5.基于标签数据矫正结果,并可视化
6.Meanshift模型,提升模型表现
7.数据降维PCA处理,提升模型表现

VGG-16:
来源于《第八章 深度学习之卷积神经网络CNN》中:

上面的AlexNet模型的卷积、池化,它们的尺寸是变化的。

但是,对于VGG-16:

  • 所有的卷积,都是3x3;--------- 是固定不变的
  • 所有的池化,都是2x2;--------- 是固定不变的

VGG-16,是三个经典的CNN模型之一。

original_data样本数据:

7.1 task1:数据增强,扩充确认为普通苹果的样本数量

1.

图像增强时,必须是文件夹里的一个子文件夹。所以,需要新建一个子文件夹,命名为4:

2.

接下来,就可以对上述子文件夹中的10张苹果图片(因为有标签,且希望正样本多一些),进行图片增强:

  • rotation_range=10, -------------------------------------- 旋转
  • width_shift_range=0.1, --------------------------------- 平移,水平方向
  • height_shift_range=0.02, ------------------------------ 平移,垂直方向
  • horizontal_flip=True, ------------------------------------ 翻转,水平方向
  • vertical_flip=True ----------------------------------------- 翻转,垂直方向

VGG-16这个CNN模型,所要求的图片尺寸是:target_size=(224, 224)

每个批次,可以产生的图片数量:是2;

for循环,是一共有100个批次。(所以,一共产生200张图片)。

3.

因为现在只有一个文件夹(叫4),所以上面代码结果是发现了1个classes;

结果,如下图:

bug:

solution by GPT:

4.

新建一个训练文件夹,将上述的通过数据增强“新诞生的”的200张图片放进来;并将原始的30张图片,也放进来。(这样,一共就230张图片)。

7.2 task2:数据提取,使用VGG16模型来提取图像特征

单张图片的展示、特征提取:

1.

并将上述图片,转换为数组:

我的问题:

上面的3指的是什么?

2.

使用VGG16模型来提取图像特征

  • weights="imagenet" 加载出前面的系数
  • include_top=False 不需要输出层

preprocess:

预处理

3.

7 7 512,这就是VGG16进行flatten展开之前,所输出的结果;

这个25088,其实跟我们vgg16完成特征提取之后的维度,一样:

bug:

solution:

7.3 task3:图片的批量处理

1.

之所以是双右斜杠,是因为这是一个绝对引用,避免后续可能的读取错误。

2.

定义一个单张图片,特征提取的方法。后续批量处理时,可以直接调用这个方法。

  • 方法里的features = model_vgg(X) ,就是利用已有的VGG16模型,来专用于提取特征;

在for循环中,持续的调用上述的方法:

7.4 task4:Kmeans模型,尝试普通、其他苹果的聚类

7.5 task5:基于标签数据矫正结果,并可视化

1.

类别数量多的是普通苹果,

类别数量少的是其他苹果。

即,可以理解为总共230张苹果图片,有210张图片是普通苹果,来实现监督学习。

让众数,来矫正聚类模型的结果(无监督学习)。

先尝试使用了别人已建好的cnn模型(VGG-16)(监督学习),来提取特征;

还需要用到kmeans这个聚类模型(无监督学习)。所以,下图这个变量叫:cnn_kmeans

2.

批量可视化:

  • 有45行,每行5列。

3.

看下测试数据集的效果:

测试数据接,测试数据的文件夹:12张苹果图片:

代码:

因为是一共12张测试图片,所以采用3行4列的可视化图的排布:

4.结果:

效果不太好:很多的都不太准;


5.启发

不要诅丧。现实中,这很常见。

“数据质量,决定了模型效果的上限。”

所以,下一步,应该聚焦到数据质量上。

(1)

下图:普通苹果,是一类。其他的苹果,分散到周边。

Kmeans聚类的原理:以k个点为中心进行聚类,聚拢最靠近的点。

  • 适合下图上面的好几坨的常见。

(2)

但是,本项目中的苹果的场景,不太适合。所以,接下来采用Meanshift均值漂移的聚类:

7.6 task6:Meanshift模型,提升模型表现

1.

其中,X = all_img_features是之前已提取到的特征,(230, 25088);

因为一共是230张图片,70%的比例,就是140张左右;

因为Meanshift均值漂移的聚类,可以自动的找出一共有多少类。

可以理解为:普通苹果是一类,其他的苹果,还会有很多的类,不只是一共有2类。

比上面的Kmeans模型,模型训练所用的时间,相对较长:

2.

根据,np.int64(0): 220,数量最多的id是0.所以,这就是普通苹果。

结果:

整体看上去,不错。虽然,有个别的样本,预测错误。

3.

看一下测试数据的效果:

结果:

一共12个样本,有3个预测错误。75%的准确率。

相对于Kmeans聚类,有了很大的提升。

既然,Meanshift均值漂移的聚类,效果不错。能否让效更好一些呢?

再回顾那句重要名言:“数据质量,决定了模型效果的上限。”

因为是无监督学习,且特征很多,很有可能是有噪音的。能否把这些噪音去掉呢?

7.7 task7:数据降维PCA处理,提升模型表现

1.

因为图片的维度是:224*224,所以这里可以尝试使用200个维度.

2.

0.982已经很接近1,且大于0.95.

这说明,主要信息,已保留下来。

所以,将近4万的维度(224*224), 是很没必要的。

3.

结果:

经过PCA处理后,效果也非常好:

4.看一下测试集:

结果:

只有右下角的那一个苹果,预测错误。

准确率在11/12.

有时候识别的100%也不是好事。

因为会导致模型的过拟合。

7.8 小结

本项目中,是采用的普通苹果与其他苹果的检测。当然,也可以移植到其他领域。比如,工业或金融领域中的,异常数据检测

难道,异常数据检测,这个技术,也能完成这个实战(二)?

声明:Jerry's Blog|版权所有,违者必究|如未注明,均为原创|本网站采用BY-NC-SA协议进行授权

转载:转载请注明原文链接 - 第10章 迁移学习 transfer learning,混合模型(监督学习+无监督学习、机器学习+深度学习),两个实战


Follow excellence, and success will chase you.