目录
一、本章内容
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.例子
太阳能电池板的表面,图片检测:
划痕、斑痕,的出现位置、角度,是随机的。
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库中数组,补充:
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 小结
本项目中,是采用的普通苹果与其他苹果的检测。当然,也可以移植到其他领域。比如,工业或金融领域中的,异常数据检测
难道,异常数据检测,这个技术,也能完成这个实战(二)?
Comments | NOTHING