卷积神经网络与MNIST数据集
- 相关学习链接在文中或文末放置
- 本文是在学习《数据挖掘》时,自学了解卷积神经网络的情况下,初学者查阅资料的总结
- 希望共同学习,提出建议,必虚心接受。
1.卷积神经网络是什么?
卷积神经网络是一种前馈神经网络,可以通过反向传播算法来优化结构,求解未知参数,常用于处理大型图片,包括卷积层和池化层。
一般有以下几步完成:
- 卷积层初步划分特征
- 池化层对卷积层的特征进行提取主要特征
- 全连接对于所有特征进行整合
- 产生分类器对图片进行测试与预测
在理解卷积神经网络的过程之前,需要明白:
机器对图片的识别过程:
对于一张图片,是由许多的像素点形成的,像素点里的数字代表颜色码,颜色码范围是[0,255],这样就构成了一个存储数字的矩阵,而机器在识别这张图片的过程,是将矩阵不断分割成小部分,将每一个小部分中的特征进行提取,最终汇总在一起,进行预测的。
2.mnist数据集:
MNIST手写数字数据库的训练集为60,000个示例,而测试集为10,000个示例。它是NIST可提供的更大集合的子集。这些数字已进行尺寸规格化,并在固定尺寸的图像中居中存储。
也可以参考一下:
关于tensor,即张量的理解,可以看这个,个人觉着有所受益:https://www.cnblogs.com/xiaoboge/p/9681229.html
图片数据将被解压成2维的tensor:[image index, pixel index] 其中每一项表示某一图片中特定像素的强度值, 范围从 [0, 255] 到 [-0.5, 0.5]。 "image index"代表数据集中图片的编号, 从0到数据集的上限值。"pixel index"代表该图片中像素点得个数, 从0到图片的像素上限值。
以train-*开头的文件中包括60000个样本,其中分割出55000个样本作为训练集,其余的5000个样本作为验证集。因为所有数据集中28x28像素的灰度图片的尺寸为784,所以训练集输出的tensor格式为[55000, 784]。
数字标签数据被解压称1维的tensor: [image index],它定义了每个样本数值的类别分类。对于训练集的标签来说,这个数据规模就是:[55000]。
卷积神经网络
1.卷积层:
原理:
以mnist数据集的图片为例:一张28*28,通道为1的图片(RGB的图片为3通道,黑白的为1)
定义一个卷积核,(卷积核相当于权重,也可以是filter,即过滤器等),其作用是才能够图像中提取一定的特征,卷积核与图片对应的数字矩阵进行一一相乘得到卷积层输出结果:
图片来源:https://blog.youkuaiyun.com/kun1280437633/article/details/80817129
卷积层的取值(也就是中间的这个filter可由函数随机生成,并逐步训练调整生成)
在这个过程中,涉及到一些知识点:
所有的像素点都会被这一过程覆盖到,最终生成卷积层的输出结果,图中滑动的正是filter,尺寸为3*3
通过这种过程,可以使得卷积层逐步得出层次越来越高的特征,图片的特征是经过不断压缩得到的,最终得出的特征有助于分类。
而机器通过不同的卷积核进行相互作用最后得出的卷积层输出结果,判断卷积核的取值,通过相互作用得出的最终结果的数值大小可以进行判断,比如:
图片来源于:https://blog.youkuaiyun.com/kun1280437633/article/details/80817129
图一中的卷积核,描述了一段曲线,用它来作用到图二中老鼠的屁股上的一段,可以明显看到,最终得出的数值大小与卷积核和图片相似度大的关系。
卷积层最终结果是得出更加能够表现图片特征的卷积核并得出输出结果(数值矩阵)。
相关计算与知识点:
图片来源于:https://blog.youkuaiyun.com/weixin_42451919/article/details/81381294
- 卷积核在图片上的移动距离,即步长(stride),步长越小,明显可以看到,特征能够覆盖的越全面,所以得到的特征也就越多,但是效率就会越低,虽然如此,步长也不能过大,不能遗漏图片上的像素点并且会改变输出图像与原图像的大小一致。
- 在filter移动的过程中,边缘像素点会被覆盖到的次数会明显少于中间像素点 ,所以在图像周围加上一圈边界0,即(pad),加多少pad,一般为了维持输出图像与原图像大小不变,会将卷积过程中的padding参数设置为=same,也就是自动填充pad。
- 图一中卷积过程后的图像大小是由图二公式得出的,一般都是与原图像相同大小的。
- 权值共享:一张图像的一个位置被相同尺寸大小的filter扫描,权重是相同的。
卷积过程中的反向传播过程并不是十分了解 ,日后学习后增加。
2.池化层
池化层的输入即卷积层的输出结果(卷积层的输入与卷积核相互作用得出的数值矩阵)
池化就是卷积层得出的图像进行特征压缩,
常见的池化层形式:
- max-padding:选取指定区域中的最大值最后集合在一起表示整片区域
- mean-padding:选取指定区域中数值的平均值最后集合在一起来表示整片区域
例如:
图中的图像尺寸为4*4,步长为2,也就是扫描过得数值将不再扫描:
图片来源:https://blog.youkuaiyun.com/kun1280437633/article/details/80817129
3.全连接层:
卷积层与池化层的最终目的是为了提取特征并对图像进行压缩,全连接层则是为了生成分类器,完成最终输出。
将池化层的输出结果重新切割成向量,并乘上权重矩阵,加上偏置值,使用ReLU激活函数并使用梯度下降优化函数。
代码:
#http://yann.lecun.com/exdb/mnist/
# train-images-idx3-ubyte.gz #60000张训练集图片
# train-labels-idx1-ubyte.gz #60000张训练集图片对应的标签
# t10k-images-idx3-ubyte.gz #10000张测试集图片
# t10k-labels-idx1-ubyte.gz #10000张测试集图片对应的标签
#解压后得到:
# train-images-idx3-ubyte
# train-labels-idx1-ubyte
# t10k-images-idx3-ubyte
# t10k-labels-idx1-ubyte
import numpy as np
import matplot