第8章 深度学习之卷积神经网络:CNN=卷积+池化+MLP,图像填充padding层,flatten展开层,经典的CNN模型(3个),两个实战


目录


上节:介绍了多层感知器MLP。它的核心是,让计算机模拟人的神经网络结构,组建一个模型,来进行非线性的预测。把简化的逻辑回归模型叠加在一起,形成一个巨大的网络,来去完成一些复杂的预测任务。

本章节:基于上节的MLP,加上一个卷积的功能,就能预测复杂图像。

一、本章介绍

1.1 5个部分

1.2 上节回顾

1.

上节的内容:对于分类任务,正因为简单的逻辑回归存在如下局限性:图像像素越大,训练参数会极大,

所以,引入MLP多层感知器。

2.

上述:只是28x28的像素的图片,46万个参数。

但是,如果是很大的像素的图片呢?如下的500x400的像素图片,参数有7800万个。

有没有一种可能性,不用非得遍历每一个像素的灰度值,减少训练参数的数量,也能同样精度的顺利完成任务呢?

答:有。因为所有的图像,都是有轮廓的。

既然图像都是有轮廓的,那么就可以只提取轮廓信息(特征信息)。

二、卷积神经网络(一)

卷积神经网络:CNN,convolutional neural network。

2.1 卷积:convolution,通过滤波器矩阵,来只提取特征

中间:是一个雪花符号

2.2 图像的卷积运算:通过滤波器矩阵,提取横向、竖向轮廓特征

1.数学表达式

图像矩阵 x 滤波器矩阵 —>

2.图像中的轮廓提取aa

本质:是因为轮廓的两边的灰度值,是有变化的。所以,通过滤波器矩阵,来提取出来。

2.3 卷积神经网络的核心:求解轮廓过滤器矩阵W

1.

卷积的核心:就是自动找出合适的轮廓过滤器矩阵W。

左下角:是三个常用的过滤器矩阵

右下角:也可以自己整一个,维度可以是3x3,也可以是4x4。

对于猫,有外轮廓,也有嘴巴、鼻子、眼睛、尾巴等,这其实也是轮廓。

因此,一个滤波器矩阵,是不够的。

2.

现实生活中,对于彩色图片,它们是RGB。(Red、Green、Blue)

2.4 池化:将图像矩阵,转换为更低维度的矩阵

目的是:对于复杂图像,尽可能的减少计算的参数。

上节:卷积。只提取图像的特征。

本节:池化。减少重复的、不必要的运算。训练参数的大幅缩减。

有两种的池化方式。用的最多的是第一种。

最大化的池化。

只要池化的参数选择合理,是能够将图片的核心信息保留下来的。

以前的机器学习:

PCA的维度缩减,也是保留主要核心信息。与之同理。

平均化的池化:

2.5 卷积神经网络 CNN:卷积+池化+MLP

1.构成

卷积+池化+MLP

2.Relu的激活函数

卷积之后,池化之前,需要进行一个激活函数:Relu函数。

  • 当x小于0时,取0。--------------------- 对于没用的信息,直接权重设置为0.
  • 当x大于0是,取x。

逻辑回归模型:

其激活函数是sigmoid函数。

对于MLP求解时,需要求解激活函数sigmoid的导数。当大于一定范围或小于一定范围时,导数会很难求:太小了,迭代非常慢。这是一个问题。

但是,对于Relu函数,就没有这个问题。

3.

池化后的结果,是mxm的矩阵。

但是,MLP的输入必须是n行1列的,即nx1。即全连接层。

所以,需要对池化后的结果,进行一个格式的转换。

2.6 两大特点:参数共享、稀疏连接

过滤器的矩阵,是要逐步覆盖整张图片的。因为过滤器,是逐步滑动的。

左上角的两个亮色的60,只与原图中的左上角的数据有关。同理,右下角的也一样。两者独立、互不影响。

真实的图片,轮廓一定是互相挨着的。隔海相望的轮廓,其实是没有用的。CNN就能抓大放小,忽略掉远处的没用的特征。

2.7 课后题

卷积后:

(500-4)/2+1 = 249

(400-4)/2+1 = 199------------------------------------249x199x3

池化后:

(249-2)/2+1 ------------------------------ 124.5 奇数?

(199-2)/2+1 ------------------------------ 99.5 奇数?

三、卷积神经网络

介绍一下图像的填充,以及一些经典的卷积神经网络CNN。

3.1 卷积运算的两个弊端:因为滤波器导致图像压缩,信息丢失;边缘信息使用少,易被忽略

第一个问题,因为滤波器矩阵的缘故,原图像矩阵由5x5变成了3x3。

第二个问题,边缘信息使用较少。比如,左上角的红色点处,只被使用了一次。同理,右上角、左下角、右下角,也是。

如果是中间的点处,就会被使用到很多次。

3.2 图像填充 padding:在图像边缘增加像素,确保卷积后仍维持原图大小(same)

3.3 四种技术的层:卷积层、池化层、padding层、flatten层

卷积层:用于提取轮廓信息(特征信息)。

池化层:保证核心信息的基础上,进行维度缩减。

padding:在图像边缘填充像素,确保图像的边缘信息不会丢失。

flatten层:卷积后的结果,进行展开,确保与MLP的连接。作为MLP的标准输入

其中,flatten展开层:

flatten:

to make flat,
BECOME LEVEL

3.4 经典的CNN模型:3种

3.5 LeNet-5

卷积:5x5的过滤器filter,滑动窗口是1. 会用6个过滤器。---- 能够改变通道数

池化:平均值的池化.------------------------------------------------------- 池化不会改变通道数。

只有1个通道,意思是说,是个黑白图片。

通道数在增加,即filters在增加。

  • 28x28x6中的6,指的是过滤器filters的数量为6
  • 10x10x16中的16,指的是过滤器filters的数量为16

3.6 AlexNet

现实生活中,经常用:

原始的图片,有3个通道,意思是说,这是个彩图。

池化:是最大值的池化;-------------------------- 我的问题:256是怎么来?答:是256个filters的数量

在卷积的时候,使用same:表示图像进行填充。确保图像的前后,尺寸一致。

特点:

3.7 VGG-16

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

但是,对于VGG-16:

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

FC是全连接层。

模型的层数更深,所以其训练参数也更多。

后续的实战部分,使用的正是VGG-16.

3.8 经典的CNN模型,可用于的新场景

第一种,比较常见。

比如:

2.9 课后题

考察的是卷积、池化、same(padding填充)的计算方式。

四、实战准备

4.1 实战(一):建立CNN,实现猫狗识别

CNN的结构:

4.2 具体步骤:

1. 图片加载

1/255就是归一化

CNN求解时,希望每一次会选里面的32张图片,进行反向梯度的搜索。(如果越小,损失函数求解时会下降的不稳定,所以往往会调大一点)

2. 建立CNN模型

建立CNN模型,与建立MLP模型,是差不多的;

全连接层的下面,是由两个层:

  • units是28,指的是输入层;
  • units是1,指的是输出层。

3. 训练与预测

一般:fit;

现在:fit_generator:因为这里是通过keras的图像生成器来生成图像的。

4.3 实战(二):基于现成的VGG-16,建立自己的简化MLP结构,来实现猫狗识别

任务

4.4 具体步骤

1. 图片加载、图片预处理

2. 加载VGG-16结构(去除全连接层)、提取特征

3. 建立MLP模型

只有一个隐藏层,神经元的数量units是10;

输出层,因为最后的输出只有0和1,所以使用的激活函数是sigmoid;

上述,只是对单张图片的操作(加载和预处理)。

如果是一个文件夹中有很多的图片呢?

那就需要对图片进行批处理,写一个循环的方法。

五、实战(一):建立CNN,实现猫狗识别

5.1 任务

1.

基于dataset/training_set文件夹中的图片数据,根据提供的结构,建立cnn模型,识别图片中的猫/狗,计算预测准确率。
1.识别图片中的猫/狗,计算基于dataset/test_set文件夹中的测试数据的预测的准确率;
2.从网站上随机下载几张猫/狗图片,对其进行预测。

2.

具体的数据:

在dataset/training_set文件夹中:

  • dogs:有4000张图片;
  • cats:也有4000张图片;

5.2 代码编写

(一)识别图片中的猫/狗,计算基于dataset/test_set文件夹中的测试数据的预测的准确率;

1.load the data

图像的增强。将1000张,扩展为10000张。

因为猫可能会出现在图片的任意位置,所以有可能会对图片进行平移。

但是,现在,rescale=1./255只是对图片进行归一化。

如果是其他的图片操作,比如平移、旋转,可以去参考官网文档。

https://blog.keras.io/building-powerful-image-classification-models-using-very-little-data.html

因为从网上下载的图片,其尺寸千差万别、各不相同。

所以,需要对其进行尺寸的规范化,统一为50x50.

问题1:ImportError: cannot import name 'ImageDataGenerator' from 'keras.preprocessing.image'

解决方式1:--- 没成功

解决方式2:--- 成功!

https://stackoverflow.com/questions/78145837/importerror-cannot-import-name-imagedatagenerator-from-keras-preprocessing-i

因为猫和狗的图片各有4000张,所以下图的结果显示:一共是8000张。分2个类别。

2.set up cnn model

Conv2D, maxPool2D, Flattern, Dense分别对应:卷积层、最大池化层、展开层、MLP模型中的普通的Dense layer层

32指的是过滤器filters的数量,对应的尺寸是3x3,步长是1(默认);输入图片的尺寸是:50x50x3;

3.configure the model

训练时的评估标准,是accuracy准确率。因为能直观的看到模型训练的效果。

4.train the model

因为迭代次数是25次,花了几分钟后,结果如下:

因为图像数据,是由数据增强ImageDataGenerator产生的。所以下图的方法是fit_generator()。

注意:

问题:fit_generator已被弃用。

解决:

5.accuracy

对于训练数据,准确率为:0.9865,非常好。

接下来,开始使用测试数据。

测试数据的文件夹的目录如下:猫、狗的子文件夹中,分别有1000张图片;

结果:

对于测试数据,的准确率是0.7639。不算优秀(>0.8),但是,良好。(注意:这一定不是随机预测,因为随机预测的准确率是0.5。)

cnn模型,的数据的需求量,是很大的。因为猫狗的很多特征,其实是具有相似性的。所以,一开始的时候,只对进行归一化,是不太够的。比如,后续 还可以进行图片的缩放、平移、旋转,这样就能产生更多的数据,再训练。这样测试集的准确率也会上升。

注意:
同理,evaluate_generator也被弃用。

解决:

改为evaluate() 方法:

https://stackoverflow.com/questions/63684459/should-i-use-evaluate-generator-or-evaluate-to-evaluate-my-cnn-model

(二)从网站上随机下载几张猫/狗图片,对其进行预测。

下面做一件很有意思的事情:网上随机下载几张猫狗图片。看模型“认识不”?

1.

如果结果是1,那么就是狗。如果是0,那么就是猫。

随机下载了一张狗:

model预测对了:确实是1.

2.

随机下载了一张猫:

model也预测对了:确实是0.

3.哈哈哈哈哈用了我家的猫的照片,来做个试验!

天哪,预测成功~hhhh

interesting and cool!

5.3 小结

复杂图像,指的是猫狗。因为两者的动物,是比较相似的。

六、实战(二):基于现成的VGG-16,建立自己的简化MLP结构,来实现猫狗识别

6.1 关于实战一的补充:2个

1.补充1:

上节:如果是0,那么就是猫。如果结果是1,那么就是狗。---------------------- 如何确定的?

2.补充2:

上节:只是使用了两三张图片(网上随机下载),进行的验证。-------------------- 模型到底准不准?

将单张图片的预测,写到一个循环里。

注意:待实验的批量图片,其名称得是1、2、3...

写个代码,对1-9张图片,批量预测下:

  • load_img() 是keras库中,用于从本地文件目录中,加载图片的方法;

结果:

上节的实战一:建立的CNN模型,全部预测成功。

6.2 任务

使用VGG-16的结构,提取图像特征,再根据特征建立MLP模型,实现猫狗图像识别。训练/测试数据:dataset\data_vgg:
1.对数据进行分离,计算测试数据的预测准确率;
2.从网站下载猫/狗图片,对其进行预测。

注意:MLP模型只有一个隐藏层,神经元的数量units是10;

数据集:

猫:300张;

狗:300张。

6.3 具体步骤

1. 先进行单张图片的加载、预处理,再多张

(一)先进行单张图片的加载、预处理:

单张图片,确实转换成了一个n维数组;

1指的是第1张图片,该图片的尺寸是224x224x3。

全连接层之前,就是7x7x512。

(1, 25088)指的是1行x25088列的新的数组array

可视化看下,验证下是否真的那张猫图:

真的是:

(二)再对多照片进行加载、预处理

目的:对vgg文件夹中的所有图片,进行批量的预处理。

训练完后:

300+300=600

2. task1:对数据进行分离,计算测试数据的预测准确率

参数有25万个,比之前自己建立的cnn模型,要少很多。

模型的训练,也更快(上次的cnn模型,花了15min。这次也就5秒钟)。

也更准确(这次的准确率是1.0,是100%)。

针对测试集的准确率,如下:

3. task2:从网站下载猫/狗图片,对其进行预测

1.

一张一张图片的预测:

2.

如果是针对九个图片呢?

批量的预测如下。

6.4 小结

就是,将别人的模型利用起来,这是非常高效的。

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

转载:转载请注明原文链接 - 第8章 深度学习之卷积神经网络:CNN=卷积+池化+MLP,图像填充padding层,flatten展开层,经典的CNN模型(3个),两个实战


Follow excellence, and success will chase you.