前提
语言:python
框架:tensorflow
深入学习的入门就是手写数字识别,相当于我们学习语言的第一个helloworld一样
最为最基础最小白的你,最好先入手Keras框架,Keras框架的后台是tensorflow
至于Python的安装、Tensorflow的安装以及Keras框架的安装,看官网这里 https://keras.io/zh/
整个手写数字识别的思路如下
数据集里面训练集(例如 写着数字5的图片),训练集对应的标签(例如 5),有测试集,测试集对应的标签;
训练集是用来训练模型的,测试集是用来评估这个模型性能的,模型加载测试集的图片,预测图片上的数字,然后与测试集对应的标签进行验证,如果准确率高,那么这个模型性能就优。
注意:机器是不认识也看不懂图片的,它模仿的是人的大脑神经的学习的过程,在经过隐藏层,通过输出层输出一个预测的值,来与训练集对应的图片进行校验,不断的调整误差,提高识别率,来达到智能识别的效果!
当然很多的名词如损失函数,优化函数,随机梯度下降,全连接层,卷积层,池化层等等,如果把这些全部弄懂了再入门的话,我想你也不想入门了,心疲倦了。所以我们先通过一个最简单的例子,来了解一下深度学习,然后再来学习各种算法。
首先,我们从keras框架的数据集里面导入我们需要的mnist数据集;
mnist数据集里面的图片是美国研究所人员专业收集的各类人群的手写图片,识别率达到99%,它是教材一样的专业;
如果我们自己做什么声纹识别啊,最好数据集是可以从网上下载的;
第一步、加载数据集
m_train是训练集图片,一共是60000张,每张的宽高是28*28,是灰白图片;
m_lable是训练集图片所对应的标签(数字在0-9之间)
n_test是测试集图片,一共是10000张,每张的宽高是28*28,是灰白图片
n_lable是测试集图片所对应的标签(数字在0-9之间)
mnist.load_data()是加载数据集,如果没有程序就会自动从网上下载下来,名称为mnist.npz
如果有,就会自动加载数据
m_train.shape是训练集的形状,第一个60000是图片的张数,第二个是宽,第三个是高;
第二步、预处理训练集与测试集
2.1、我们的图片是(28,28)的,但是在深度学习的时候,以整张图片为主,应该是28*28=784
2.2、标签是0-9,10类,这10类之前没有大小区分,为了方面,全部变成one-hot的形式
one-hot就是
如果是三类那么就是100 010 001
如果是四类就是 1000 0100 0010 0001
##处理图片
m_train=m_train.reshape(m_train.shape[0],-1)
n_test=n_test.reshape(n_test.shape[0],-1)
##one-hot编码
m_lable=np_utils.to_categorical(m_lable,num_classes=10)
n_lable=np_utils.to_categorical(n_lable,num_classes=10)
第三步、创建模型,添加隐藏层
units=512是指的是512个神经元,只有第一层的时候,需要指定输入input_dim=784;
##创建序贯模型
model=Sequential()
# ##输入层不用添加
model.add(Dense(units=512,input_dim=784,activation='relu'))
model.add(Dense(units=512,activation='relu'))
# ##输出层
model.add(Dense(units=10,activation='softmax'))
第四步、损失算法与优化算法
model.compile(loss='categorical_crossentropy',optimizer='Adam',metrics=['accuracy'])
model.fit(m_train,m_lable,batch_size=50,epochs=3)
第五步、用测试集来评估模型的优劣
##评估已经训练过的模型
loss,mm=model.evaluate(n_test,n_lable)
print(loss,mm)
现在附上完整的代码
from keras.datasets import mnist #从数据集里面导入数据
from keras.models import Sequential #导入序贯模型
from keras.utils import np_utils ##所有导入函数
from keras.layers import Dense #全连接层
##加载数据
(m_train,m_lable),(n_test,n_lable)=mnist.load_data()
print(m_train.shape)
##处理图片
m_train=m_train.reshape(m_train.shape[0],-1)
n_test=n_test.reshape(n_test.shape[0],-1)
##one-hot编码
m_lable=np_utils.to_categorical(m_lable,num_classes=10)
n_lable=np_utils.to_categorical(n_lable,num_classes=10)
##创建序贯模型
model=Sequential()
# ##输入层不用添加
model.add(Dense(units=512,input_dim=784,activation='relu'))
model.add(Dense(units=512,activation='relu'))
# ##输出层
model.add(Dense(units=10,activation='softmax'))
# ##优化与减少损失
model.compile(loss='categorical_crossentropy',optimizer='Adam',metrics=['accuracy'])
model.fit(m_train,m_lable,batch_size=50,epochs=3)
##评估已经训练过的模型
loss,mm=model.evaluate(n_test,n_lable)
print(loss,mm)
##用于给定输入的训练模型
model.save('tjn.h5')
好了,到这里,我们就可以运行程序,进行模型的训练与评估了
如果刚运行程序,就报错 module 'tensorflow' has no attribute 'get_default_graph'
原因在于tensorflow的版本与keras版本不兼容导致的;这个时候我们需要降低或者升高keras的版本
运行结果如下
训练的模型的准确率为96.37%
测试的时候准确率为96.23%
是不是头还晕晕的?
什么损失函数,优化函数,什么神经元,究竟是怎么回事啊?
你要是现在就知道了,那么不用学了.....
你先敲一遍,然后运行出来以后,我们下一篇探讨一下随机梯度算法与反向传播!