前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >机器学习-手写数字识别

机器学习-手写数字识别

作者头像
sjw1998
发布2019-09-28 12:50:20
1.3K0
发布2019-09-28 12:50:20
举报
文章被收录于专栏:孤独的S孤独的S孤独的S

据说,在命令行窗口打印出‘hello,world’是入门编程语言的第一个程序,那么手写数字识别就是机器学习的hello,world了,学习的东西不经常复习的容易忘记,因此在这里记录一下。


最初学习机器学习的时候,我自己先做的其实是线性回归和逻辑回归,但是我用自己创建的函数和数据一直不能很好的让结果去拟合数据,所以不是成功的代码,还是需要在多研究一下。

关于机器学习的视频,我个人推荐吴恩达和李宏毅的视频,结合起来看可能会很乱,但是理解到的话,还是会很清晰的。

要进行手写数字识别,首先需要数据,然后在定义一个神经网络来对数据进行训练,然后把训练好的权重和模型保存起来,在另外的程序调用,并拿来测试你想要测试的图片,看看训练的结果是不是比较正确。

关于数据获取,这里选择的keras自带的数据集,可以在keras的官网可以找到你需要的数据集,https://keras.io/datasets/

数据集包含10个数字的60,000个28x28灰度图像,以及10,000个图像的测试集。

下载好数据集后,接着需要将数据处理一下,将其变成程序需要的格式,具体代码如下:

from keras.utils import to_categorical
train_images = x_train.reshape((60000,28*28))         #将x_train转化为(60000,784)的格式
test_images = x_test.reshape((10000,28*28))

train_images = train_images.astype('float32')/255   #将图像的数值变成0-1之间的小数
test_images = test_images.astype('float32')/255
train_labels = to_categorical(y_train)
test_labels = to_categorical(y_test)

这个是没有astype的x_train的值:

这个是经过astype()之后的数值

接着,to_categorical就是将类别向量转换为二进制(只有0和1)的矩阵类型表示。

用keras搭建神经网络的代码很简单,也就十几行代码就可以实现一个简单的神经网络用来训练数据了。

from keras import models
from keras import layers
network = models.Sequential()
network.add(layers.Dense(633, activation='relu', input_shape=(28*28,)))
network.add(layers.Dense(633, activation='relu'))
network.add(layers.Dense(10,activation='softmax'))
from keras import optimizers
network.compile(optimizer = 'adam',
                loss='categorical_crossentropy',
                metrics=['accuracy'])
network.fit(train_images,train_labels, epochs=5,batch_size=128)

test_loss, test_acc = network.evaluate(test_images, test_labels)
print('test_acc:', test_acc)
network.save('shouxie.h5')

第一步是构建模型:

如代码所示,首先导入需要的库函数,定义一个神经网络的model,

Sequential是一系列网络层按顺序构成的栈

然后再给model添加输入层,指定好输入层类型,dense是指全连接,输出个数是633,激活函数是relu,输入个数是28*28个。然后再添加一个隐藏层,这里就不用定义输入个数,只需要输出的和激活函数,紧接着就是输出层了,因为我们的数字是0-9,有10个数字,这里的大小也是10,而这里的激活函数就要改成softmax,模型就这样构建完成了。

接着就是第二步编译一下模型:

用compile函数来编译,并定义好,损失函数,优化器(比如梯度下降)的方法,以及metrics函数。

第三步就是用fit函数来训练模型:

x_train,y_train :训练数据集

batch_size :指定一个size表示每次更新一次参数需要从训练集中随机抽取多少个样本,一般越大速度越快

epochs :每次使用完所有的训练数据集表示一次epoch

test_loss, test_acc = network.evaluate(test_images, test_labels)
print('test_acc:', test_acc)

这里就是将训练结果的成功率和loss结果提取出来,并输出结果。

到这里一个神经网络也就搭建完成了,如果需要能提取模型,以便我们使用训练的结果的话,还需要将模型保存起来,这里将模型保存成h5的格式。

再用训练得到的模型对数据预测,可以看出预测的结果是对的,模型的准确率也有97之高。

就这样一个机器学习的helloworld就做好了。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-08-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 孤独的S 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档