keras构建神经网络实现手写数字识别

本文使用神经网络库keras构建一个简单的神经网络来实现经典的手写数字识别任务。

import keras
import numpy as np
from keras.datasets import mnist #导入手写数字数据
(train_images, train_labels), (test_images, test_labels)= mnist.load_data() #把训练集和测试集拿出来
train_images.shape, train_labels.shape #观察图像的形状和标签的形状
train_labels #每个手写数字的真实标签,值为0-9

可以发现,train_images是一个形状为(60000, 28, 28)的三维数组,表示有60000个手写数字,每个数字用28像素*28像素的矩阵表示,矩阵中的元素是0-255之间的整数,表示灰度(颜色的深浅)。
接下来就开始导入神经网络的各个模块:

from keras import models #models包含神经网络的各种配置,包括激活函数,损失函数,正则项,优化算法,初始化方法等
from keras import layers #layers包含常见的神经网络层,例如卷积层、池化层、循环层、全连接层等
network= models.Sequential() #创建一个空的序贯模型,
#序贯模型是函数式模型的简略版,为最简单的线性、从头到尾的结构顺序,不分叉,是多个网络层的线性堆叠

创建了一个空的Sequential()模型后,接下来就只需在依次地添加输入层、隐藏层和输出层了:

#添加输入层:
network.add(layers.Dense(512, activation= 'relu', input_shape=(28*28,))) #往模型中增加一个全连接层,宽度为512,激活函数为relu,输入形状为28*28

注意在输入层中需要通过input_shape指定输入的形状为28*28,因为我们每张图片是28*28的矩阵,但是其后的隐藏层和输出层会自动识别前一层输出的形状,因此隐藏层和输出层不需要指定input_shape。接下来再构建隐藏层和输出层:

network.add(layers.Dense(256, activation= 'relu')) #隐藏层,宽度(神经元个数)为256,同样适用relu函数作为激活函数
network.add(layers.Dense(10, activation= 'softmax')) #再增加一层,这层是输出层,宽度为10(因为要预测该手写数字的真实标签是0-9这10个数字中的哪一个)。
#使用softmax激活函数使这一层输出10个数字对应的概率

至此我们的神经网络就有了输入层、隐藏层和输出层了,一个简单的神经网络模型就搭建完成了。但是在搭建完模型之后还需要进行编译(compile):

network.compile(optimizer= 'rmsprop', loss= 'categorical_crossentropy', metrics= ['accuracy'])
#指定损失函数,优化方法和性能指标

在compile函数中optimizer参数指定优化方法('rmsprop’就是类似于梯度下降法的优化方法,一般都可以用这个方法),loss=‘categorical_crossentropy’ 指定交叉熵作为损失函数,由于手写数字识别是多分类问题(有10个类),因此用这个损失函数,如果是二分类问题则用loss= 'binary_crossentropy
',回归问题则可令loss= ‘mse’(即均方误差)。由于我们关心的是模型对数字分类的准确率,因此可以指定metrics= [‘acc’]
,即输出模型的分类准确率作为性能指标,如果是回归任务,则可指定metrics=[‘mae’](即平均绝对离差)。
至此我们的模型已经搭建和编译好了,接下来就是准备数据:

#准备数据:
train_images= train_images.reshape((60000, 28*28)) #将train_images的维度由(60000, 28, 28)重置为(60000, 28*28)
train_images= train_images.astype('float32')/255 #将灰度范围映射到[0,1]区间
test_images= test_images.reshape((10000, 28*28))
test_images= test_images.astype('float32')/255
#准备标签:
from keras.utils import to_categorical
train_labels= to_categorical(train_labels) #将整型的类别转化为one-hot编码
test_labels= to_categorical(test_labels)

接着就是模型的训练了:

#模型训练:
network.fit(train_images, train_labels, epochs= 10, batch_size= 128)
#batch_size=128表示每128个样本计算一次损失函数并更新权重,epoch=5表示所有数据要通过神经网络5次

模型训练完成,最后我们来看看我们的模型在测试集上的效果如何:

predictions= network.predict(test_images)
#predictions是一个10000*10的数组,每一行是该张图片数字为0-9的概率,测试集一共有10000张图片因此是10000行
#看下损失和准确率:
test_loss, test_acc= network.evaluate(test_images, test_labels) 
test_acc

结果在测试集上的准确率约为98.36%,很不错。以上就是使用keras建立神经网络进行手写数字识别的内容,之后会使用神经网络进行回归任务。

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值