目录
上节:介绍了多层感知器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 小结
就是,将别人的模型利用起来,这是非常高效的。
Comments | NOTHING