第7章 深度学习之多层感知器MLP(人工神经网络)、非线性分类预测、Keras库介绍、两个MLP实战(二分类、0-9图像多分类)


目录


数据质量,决定了模型表型的上限。

以前:机器学习。

现在及以后:深度学习。

一、本章介绍

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超时而安装失败。所以,我使用了清华大学的镜像源:

参考'https://cloud.tencent.com/developer/information/%E5%AE%89%E8%A3%85tensorflow%E5%AF%BC%E8%87%B4%E8%B6%85%E6%97%B6'

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.计算模型在预测数据集的准确率

根据训练集和测试集的准确率可知:

该模型的预测还是非常准确的。

更直观的结果?

针对测试集,直观的展示一下。

6.3 小结

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

转载:转载请注明原文链接 - 第7章 深度学习之多层感知器MLP(人工神经网络)、非线性分类预测、Keras库介绍、两个MLP实战(二分类、0-9图像多分类)


Follow excellence, and success will chase you.