赞
踩
目录
在机器学习神经网络领域,对于不想过多了解底层原理的初学者而言,其实有一个应用层面一般意义上的经典“Hello World”:手写体识别
,因为其场景和问题都很简单明确,更有经典的数据集mnist成为了众多入门者必备的实践项目。
mnist的数据集的图片采用的是28*28的灰度图。灰度图显示图像的原理是这样的,一行有28个像素点,一共有28行,每一个像素用一个字节的无符号数表示它的等级,如果是0,那就是最暗纯黑色,如果是一个字节的最大值255,那么就是最亮纯白色,如果是中间的值,那就是介于两者之间的灰色。
如果用键盘输入这些数字图像,精确的计算机在显示同一个字符的时候,每一次每个像素点的灰度值都是一样的。但人毕竟不同于精准但呆板的计算机。比如我们拿一支手写笔,在这个28*28的屏幕上手写数字五,每一次写得都不太一样。这时候也就没有什么确定的规则去根据这些像素的灰度值判断是什么数字了。
换句话说,这不再是一个适用于计算机机械逻辑做判断的问题,我们需要用有一定容错能力的系统来做这件事情。很明显,神经网络是一个很好的选择。我们已经知道如何搭建一个神经网络,那现在唯一的问题是如何把这些图片送入其中?神经网络的输入是一个多维的向量,或者说一个数组,而图片是一个方形的像素灰度值的集合。没错,我们把这些像素从头到尾一行一行的依次拉出来就好。
mnist的数据集每张图片的尺寸是28*28,所以这将拉出784个像素,我们把mnist数据集(手写图片数据)以784维向量作为输入,依次送入神经网络进行训练就好。
在机器学习的工作流程中,我们在训练时使用的数据集称之为训练集。当然,我们希望在训练集上的准确率很高,这意味着模型拟合的效果很棒。当我们会在训练之后,在训练级数据之外拿一些新的数据进行预测,看看这些新的数据在模型上的准确率如何。这些用来测试的样本数据称之为测试集,我们希望在测试集上的准确率也很高。实际上,我们在考量一个模型好坏的时候,更倾向于它在测试集上的表现,因为在测试集上那高准确率意味着模型在遇到训练中没有遇到过的新问题时,也能很准确的进行应测,换句话说,这个模型有足够的泛化能力。
模型在训练集和测试集上的不同表现导致了机器学习中三种常见的现象:
1.训练集准确率很低,这个模型多半是废了,这个现象称为欠拟合,可能模型过于简单
2.训练集准确率高,测试集准确率也很高,说明该模型拥有很好的泛化能力 ,有能力去解决新的问题。
3.训练集很高,测试集准确率出现明显下降,说明这个模型的泛化能力不行,称为过拟合,原因有很多,比如用一个过分复杂的模型拟合一个实则简单的问题,当然解决过拟合也有很多方式,比如:调整神经网络结构、L2正则化、节点失活(Dropout)正则化等等。
4.训练集的准确率很低,但测试集的准确率却很高。从概率上来说,这种见鬼的情况几乎不存在。
mnist的数据集有6万个训练集样本和1万个测试集样本,而人们发现,在用全连接神经网络做mnist的的数据集识别以及其他图像识别的时候,尽管我们已经把网络堆叠的越来越深,神经元的数量也越来越多,也用尽了各种防止过拟合的方法,但网络的泛华能力仍然越来越难有所突破。
深度学习巨头人物之一的Lecun制作了一个完整的表格,罗列了机器学习各个领域在mnist的数据集上的工作成果。从线性分类器KNN到Boosted Stumps,SVM,直到神经网络和卷积神经网络,判断的标准就是在测试集上的错误率。就像我们说的,模型只有在测试集上的准确率上去了,才是有足够泛化能力的好模型。
目前对于纯粹的深度神经网络最好的效果是2010年的一个六层网络,但是网络规模已经达到了每一层神经元的数量,分别是784-2500-2000-1500-1000-500-10这样的巨大规模。作者也毫不避讳的说道,他们就是在用暴力,他们有能够加速训练的显卡。这个网络的规模和结果,或许就是人们在mnist的问题上,用纯粹的全连接深度神经网络的极限能力,如果继续练死劲,意义已然不大,数量的堆积已经很难带来质量的提升。
接下来我们介绍卷积神经网络。我们来看卷积神经网络在mnist数据集中的成果,即使是早在1998年就被提出的经典的卷积神经网络LeNet-5,也让测试集的准确率达到了99.2%,而2012年更是把准确率提高到了99.77%,所以为什么卷积神经网络会有这么好的效果?
作为人,我们在识别一个图片内容的时候,如果看到的是一个个像素连接起来的向量数组,那是很难做出判断的。实际上,我们人在识别一个图像的时候,往往会不由自主的提取比如轮廓、颜色、花纹这样的元素,也就是说,图像作为一个二维的物体,在二维平面相邻像素之间是存在关联的,我们强行把它降到一维,也就破坏了这些关联,失去了它重要的特征。所以一旦我们能够提取出这些特征,那就很容易做出判断,这些特征对提高模型的泛化能力有很大的作用。
基于这种想法,人们把卷积运算引入到了神经网络。下面介绍卷积运算的过程,看它如何提取重要特征?我们还是以上面的“5”
为例:
卷积核,有也被称之为过滤器。将卷积核分别乘以原始图像相对应的位置就能获得新的图像,这种卷积运算就可以提取出图像诸如轮廓,花纹,颜色的特征。
怎么快速理解这个卷积核呢,我们以一幅茶杯图像为例,思考卷积后的图像是什么样子呢?
结果发现,把垂直的边沿给提取出来了。
我们发现,把垂直的边缘给提取出来。这个卷积核的作用实际上是用来做垂直边缘的提取。
我们再搞一张极端情况的图片,这张小图中间部分很明显是图像的一个垂直边界,比如一个杯子的边缘部分。我们对这个图像进行卷积,机智如你,会发现:只有中间两列有值,其他两列均为0。 对于两边,它们就会在左右的一正一负相互抵消
对于中间部分,左大右小完全不对称,加起来之后就会把这个值变得很大,或者说特征被凸显出来了。
我们还可以用水平卷积核做出水平提取的效果,我们发现垂直检测的卷积核把水平线弄没了,而水平检测的卷积核把垂直线弄没了。
那我们再通过一个简单的例子看一下卷积是怎样在手写体识别问题上发挥作用的?
A(1)是数字1,B(1)是A向右挪了点位置,C(7)是在B的基础上画了一横。对于一个普通的全连接深度神经网络而言,展开向量,C和B更接近,因为A和B很多对应特征的位置变了。虽然作为人来说,其实A和B 更接近。
如果我用这样的一个卷积核对这两个1和这个7进行卷积,便得到了这样的结果。很明显,这个卷积核提取的是横向的边界,所以此刻到底谁更像谁,就一目了然。
本节编程实验对0-9手写体mnist数据集进行训练和测试。
在运行导入mnist的数据集这段代码的时候,如果你的电脑里没有mnist的数据集,那么Keras就会自动的去下载到本地,但在Windows操作系统中,Keras会把它下载到C:\Users\用户名\.keras\datasets,在这个文件夹下面,有一个minist.npz的文件,这就是mnist的数据集文件,一旦下载好了,那以后在调用的时候就不用再下载了,直接使用这个目录下的本地文件好了。
sigmoid函数智能进行二分类问题,softmax激活函数可以进行多分类把预测输出概率最大的为该分类标签数据。
输入数据的灰度值范围在零到255之间,那这意味着某些黑暗的像素的值,很小,比如只有1-5,而某些明亮的像素值,很大,比如200多,那这样的数据,就导致我们的代价函数很不友好,那虽然我们画不出来这个700多维的代价函数,但是我们可以用一个三维的代价函数举个例子,我们之前说代价函数是一个碗状,那如果输入数据差距过大,将会导致这个碗非常的狭窄,而进行梯度下降的时候,就会变得非常困难,而如果我们把输入数据变成0-1之间这样差距不大的值的时候,代价函数将会变得比较均匀,这样,就比较利于梯度下降的进行,所以我们让输入数据除以灰度值的最大值255。
代码实现:mnist_recognizer.py
- # 导入数据集
- from keras.datasets import mnist#导入Keras数据集minst
- from keras.models import Sequential #堆叠神经网络序列的载体
- from keras.layers import Dense #全连接层,一层神经网络
- from keras.optimizers import SGD #引入keras.optimizers调整学习率
- import matplotlib.pyplot as plt #绘图
- from keras.utils import to_categorical# one-hot编码转化
-
- #mnist数据集是10分类问题
- #获取训练集和测试集
- (X_train, Y_train), (X_test, Y_test) = mnist.load_data()
- # 查看样本数据的类型:60000, 28, 28
- print("X_train.shape:" + str(X_train.shape))
- print("X_test.shape:" + str(X_test.shape))
- print("Y_train.shape:" + str(Y_train.shape))
- print("Y_test.shape:" + str(Y_test.shape))
-
-
- # 打印标签值
- print(Y_train[0])
-
- # 训练集的第一个样本数据,绘图模式:灰度图
- plt.imshow(X_train[0], cmap="gray")#把数据绘制成图形
- plt.show()
-
- # 28 * 28 = 784 二维变一维,reshape改变数组形状
- X_train = X_train.reshape(60000, 784) / 255.0 # 减少差距,加快梯度下降
- X_test = X_test.reshape(10000, 784) / 255.0
-
- #把0-9的数值转化为one-hot编码
- Y_train = to_categorical(Y_train, 10)
- Y_test = to_categorical(Y_test, 10)
-
- #创建堆叠神经网络序列的载体Sequential
- model = Sequential()
-
- #创建全连接层,加入隐藏层,每层神经元数据为256
- model.add(Dense(units=256, activation='relu', input_dim=784))
- model.add(Dense(units=256, activation='relu'))
- model.add(Dense(units=256, activation='relu'))
- model.add(Dense(units=10, activation='softmax'))
-
- # 配置模型
- model.compile(loss='categorical_crossentropy', optimizer=SGD(lr=0.05), metrics=['accuracy'])
- #loss(损失函数、代价函数):categorical_crossentropy多分类交叉熵代价函数学习率为0.05
- # optimizer(优化器):sgd(随机梯度下降算法);学习率为0.05
- # metrics(评估标准):accuracy(准确度);
-
- #训练数据fit, batch_size送入批次的数据,显卡越好,可以送的数据越多,只能用CPU训练,你奶奶就设置小一点
- model.fit(X_train, Y_train, epochs=50, batch_size=2048)
-
- #用来测试集上的评估
- loss, accuracy = model.evaluate(X_test, Y_test)
- print("loss" + str(loss))
- print("accuracy" + str(accuracy))
训练结果:
本节课介绍了图像数据集mnist,还有训练集和测试集的含义,还介绍了图像上的卷积神经网络,编程实验对0-9手写体mnist数据集进行训练和测试。有关图像识别的问题,我们一般使用卷积神经网络,那么在下一节课,将会介绍卷积神经网络在图像识别上的效果。
10.卷积神经网络:打破图像识别的瓶颈
11. 卷积神经网络:图像识别实战
12.循环:序列依赖问题
13.LSTM网络:自然语言处理实践
14.机器学习:最后一节课也是第一节课
视频链接:https://pan.baidu.com/s/1KrKyH-S22-5KQlZdxCIMgw?pwd=riva
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。