目录
数据质量,决定了模型表型的上限。
以前:机器学习。
现在及以后:深度学习。
一、本章介绍
1.1 五个部分
1.2 任务:非线性分类预测
之前:传统的是通过逻辑回归,来完成这个分类任务。
但是,这种方式,存在局限性。
比如,下面这个任务:
再比如,下面这个任务:
1.3 图像的自动分类:猫狗识别
1.
2.
对于人眼,是能够通过大脑来分辨的。
但是,对于计算机,是如何能够分辨出来猫和狗的呢?
答:根据图中每个点及其对应的亮度,即灰度值。
- 如果是黑白图片。比如,用数字0-255代表亮度。 0 代表黑色,255代表白色。
- 如果是彩色图片。比如,分三个维度RGB。
左边是人类世界,右边则转换为计算机世界。
RGB:
RED, GREEN, and BLUE
3.
对于两张图片,选取两个固定位置的点,查到其灰度值。
一是本身的数据量,就非常大。400*500=200000
二是二次项的数据量,也会很大。200000*199999/2
为了解决上述的问题,多层感知器(Multi-Layer Perception)就应运而生。
二、多层感知器 MLP
2.1 概念:Multi-Layer Perception,又叫人工神经网络
Multi-Layer Perception,简称MLP。
1.
下图是生物学中的一个神经元的结构:
下图是将生物学中的神经元结构,数值化后的形式:
输入—处理—输出的机制
2.2 逻辑回归模型框架
上述数值化后的形式,有点像之前学习过的逻辑回归模型(第三章):
2.3 多层感知器模型框架:隐藏层是多个逻辑回归模型的叠加
生物学中,神经网络(神经系统),其实是无数个神经元组成而成的网络。
那么,类比下:计算机学中,能否也将无数个逻辑回归模型,组成一个网络呢?
老的输入|新的输入|最新的输入--->输出
其数学表达式,如下:
2.4 课后题
三、MLP用于非线性分类预测
上节:当使用逻辑回归,来进行非线性的决策边界的分类时,会有很大的局限性:即,如果初始维度很多时,还要生成很多的高次项,会导致数据量极其的庞大。
本节:MLP应运而生。
3.1 问题
3.2 实现二分类
1.
逻辑回归模型:3个单独的
2.
将上述的三个单独的逻辑回归模型,组合成一个网络
3.最终结果
精确度非常的好:不管是训练数据,还是测试数据:
3.3 实现多分类
上节:实现的是MLP的二分类。
本节:现实生活中,更多的是多分类。
1.理论
调整一下输出层即可:一变多:
2.
猫狗马:
3.4 课后题
模型的求解,是很复杂的。
但是,本课的重点是使用MLP来解决实际的问题。
四、Keras介绍与实战准备
MLP:先建立一些简单的逻辑回归模型,然后再把它们组合起来形成MLP多层感知器的网络。
这样,就能实现一些决策边界不是线性的分类任务,包括二分类、多分类。
4.1 Keras库:专用于深度学习,底层是TensorFlow
Keras库,是一个表面的前端接口:
它的底层和后端可以是TensorFlow 或 Theano:
我:数值计算?
是硕研时的《数值分析》?
Keras本质上就是一个容易与用户进行交互的外壳,帮助深度学习的快速开发:
4.2 Keras建立MLP模型
1.
输入层|隐藏层|输出层
model可以理解为:顺序模型的一个实例
2.
Dense()可以理解为:一个网络层的实例
activation指的是激活函数,这里的sigmoid指的是逻辑回归,也可以是其他的linear线性回归
3.
loss指的是损失函数,就是逻辑回归中的二分类的损失函数;optimizer指的是优化器,求解方法
4.
epochs指的是:模型的迭代次数
关于sigmoid函数:
4.3 基础开发环境的准备
4.4 实战1:建立MLP,实现非线性二分类
1.任务
2.核心代码:
(1)建立MLP模型,查看模型结构:
实例化一个顺序模型,叫mlp;
然后,将对应的层加给它,该隐藏层中有20个神经元的数量,输入的数据是2维,激活函数是sigmoid的逻辑回归;
接着,将对应的层再加给它,该输出层是有1个神经元的数量,激活函数也是sigmoid的逻辑回归;
最后,通过summary方法,就能看到该模型的整体结构;
(2)配置模型参数
这里的优化器(求解方法),是adam,损失函数是二分类的损失函数;
(3)模型训练
epochs是迭代次数。MLP的特点是:虽然不用增加很多的数据,但是迭代的时候,因为不知道是线性还是非线性,所以一开始迭代的次数会比较多,需要自己尝试,会设置的比较大;
(4)结果预测
以前,是直接的predict(),那么输出的就是0、0.2、0.5、0.7样式的概率数值;(sigmoid函数:能将任意的实数,映射到(0,1)之间)
因为当前是分类任务,所以这里的是predict_classes().因为这样就能将上述的概率数值,转换为0和1这样的分类结果;
(5)将预测结果进行可视化
以前,可视化分类模型时,会用scatter来可视化结果,中间需要进行数据的筛选。即数据的索引,必须是一个列表,或pandas库中的series的结构。
如果是predict_classes(),的输出结果,实际上是一个numpy库的一个n维数组array。是没有办法进行索引的。
所以,需要进行格式的转换。将没有索引的array转换为有索引的series。
4.5 实战2:建立MLP,实现图像的多分类
1.任务
上述的数据集,叫mnist数据集。它有6万个训练数据,1万个测试数据;
用于多分类任务,图像识别。
2.核心代码
(1)数据预处理
加载mnist数据集
可视化图片
转换输出结果的格式
转换输入数据的维度
(2)完成了数据预处理后,建立MLP模型;
有两个隐藏层;每个层都有392个神经元的数量
最后的输出层,units不再是1,而是有10行;activation激活函数不再是sigmoid,而是softmax,专用于输出多分类的结果;
(3)配置训练参数
(4)模型训练
五、实战1:建立MLP,实现非线性二分类
5.1 keras库+tensorflow环境配置
最新:直接安装tensorflow库即可,会自动的安装keras库。
1.
一开始,没有安装keras库时:会红色报错。
2.开始安装keras库
在anaconda中,切换到imooc_ai这个虚拟环境。然后,左键单击绿色箭头,点击open terminal,就进入了该虚拟环境的对应的终端的黑屏。
看一下库列表,验证下确实没有目标库:
安装keras库:
keras库安装成功:
问题:
教学视频中,keras安装时,会自动的安装了tensorflow。
但是,我的case没有自动安装。网上也有类似情况:
其他同学也有类似情况:
解决:
实际上,最新的两者的安装包的先后顺序应该是:
安装过程如下:
因为tensorflow安装包较大,容易因timeout超时而安装失败。所以,我使用了清华大学的镜像源:
TenorFlow安装成功:
小结:
本教学课程,老师说的是:只安装keras即可,会自动的安装tensorflow(较老,22年)----- 不行
但是,now应该是反过来,直接安装tensorflow即可,会自动的安装keras。--------------------- 可行
再运行下jupyternotebook中的代码:
成功的导入并运行:
注意:
如果出现的如下的问题:
ImportError: numpy.core.multiarray failed to import
情况或ImportError: numpy.core.umath failed to import
,说明该虚拟环境中的Numpy库的版本较低,需要去Anaconda中升级一下版本即可。
3.
5.2 任务描述
基于data.csv数据,建立MLP多层感知器模型(人工神经网络),计算其在测试数据上的准确率,可视化模型的预测结果:
1.进行数据分离:test_size=0.33, random_state=10
2.模型结构:一层隐藏层, 有20个神经元
data.csv数据集的数据长下面这样:
5.3 具体步骤
1.
散点图显示:
- 蓝色的,表示passed,是y为1;
- 橘黄色,表示failed,是y为0.
2.
epochs:
An *epoch in machine learning* represents one complete pass through the entire training dataset.回声:echo
问题1:关于迭代次数的设置:
先说结论:
课程中是3000次。最好改小一点,因为普通的电脑配置带不起来。我改为了700.
分析:
遇到的问题如下:
迭代速度慢,我的case是迭代到969次时,就卡住、不动了。第二次是迭代到830次时。
其他同学的情况是:
3.
下图是我的结果:因为计算机性能限制、只有700的迭代次数,所以准确率只有0.64左右,不高。
老师的结果:
因为y_train_predict是一个numpy中的数组,没有索引,所以需要将其进行格式转换:
4.
创造一组数据点集,用于绘图:
基于这些数据点集,用mlp模型来预测,得到对应的预测输出结果:
还要对该预测输出结果,进行格式转换:
可视化图的效果不是很好:
老师的结果:效果很好:
问题2:关于predict_classes()方法,在新的TF中已删。
解决:
参考文章1:(我试了不管用)
老师写的`https://mp.weixin.qq.com/s/vb5rUril7ZiQN5hkzfeD3A
干货|keras中model.predict_classes报错处理方法`参考文章2:(我平时了很管用)
5.4 小结
六、实战2:建立MLP,实现0-9图像的多分类
6.1 任务描述
基于mnist数据集,建立MLP多层感知器模型(人工神经网络),实现0-9数字的十分类task:
1.实现mnist数据集的载入,可视化图形数字;
2.完成数据的预处理:图像数据的维度转换,与归一化、输出结果的格式转换;
3.计算模型在预测数据集的准确率
4.模型结构:两层隐藏层,每层有392个神经元
6.2 具体步骤
1.实现mnist数据集的载入,可视化图形数字
mnist数据集的载入,是直接从keras库中拿到。而不是以往的通过外部的csv文件载入。
6万个样本,每个样本都是28x28像素组成的array,是可以进行图形展示的;
imshow的功能是,可以把上述样式的矩阵或一个array,直接给绘制出图来。
img1这张图,确实是一个28行*28列的图像。
随计选一张图可视化下,看一下具体长啥样,比如第一张图:
(也就是说,原始数据中,X_train是一个三维数组:60000x28x28。如下:)
拿出第一张图,看一下:
原来该张图片中,每个像素点处的灰度值(颜色),都给一一穷举出来了:
2.完成数据的预处理:图像数据的维度转换,与归一化、输出结果的格式转换
28行*28列的图像,相乘就是784.-------------------- 我的问题:为什么要对每张图片,的行和列,相乘?要转换成二维数组?
将训练数据,转换成一个6万行x784列的新的数组;
归一化;
归一化:
因为图像的数据是0-255,区间较大。为了能方便我们快速的MLP的求解和迭代,通常需要进行一个归一化。
输出结果的格式转换:
我的思考:
将一维数组的真实数字结果,转换为二维的数组,里面是通过概率的形式来表征具体的数字是谁。这中间,用到了keras库中的to_categorical()的方法。
我查了下资料1:
我查了下资料2:
3.
3.计算模型在预测数据集的准确率
根据训练集和测试集的准确率可知:
该模型的预测还是非常准确的。
更直观的结果?
针对测试集,直观的展示一下。
Comments | NOTHING