机器学习-手写数字识别

2019-09-28 12:50:20 浏览数 (1)

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


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

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

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

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

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

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

代码语言:javascript复制
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搭建神经网络的代码很简单,也就十几行代码就可以实现一个简单的神经网络用来训练数据了。

代码语言:javascript复制
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

代码语言:javascript复制
test_loss, test_acc = network.evaluate(test_images, test_labels)
print('test_acc:', test_acc)

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

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

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

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

0 人点赞