使用Keras建立手写数字识别的全连接神经网络

前言:记录一下自己写的第一个神经网络,相当于人工智能的hello world程序吧,也是记录一下Keras的基本用法,方便以后查阅也希望对深度学习初学者有所帮助!

手写数字识别

导入模块

from keras.models import Sequential
from keras.layers.core import Dense,Activation
from keras.optimizers import Adam,SGD
from keras.datasets import mnist
from keras.utils import np_utils

导入手写数字识别数据集

(x_train, y_train),(x_test, y_test) = mnist.load_data()             #从Keras自带的数据集里面下载mnist手写数字数据集
x_train = x_train.reshape(x_train.shape[0],28*28).astype('float32') #把28*28的图片矩阵数据转换为向量
x_test = x_test.reshape(x_test.shape[0],28*28).astype('float32')
y_train = np_utils.to_categorical(y_train, 10)   #把y转换为长为10的向量,手写数字是什么第几个就为1,其他元素为0
y_test = np_utils.to_categorical(y_test, 10)
x_train = x_train / 255   #降低图片数据的灰度值,便于训练
x_test = x_test /255
print(y_test)
[[0. 0. 0. ... 1. 0. 0.]
 [0. 0. 1. ... 0. 0. 0.]
 [0. 1. 0. ... 0. 0. 0.]
 ...
 [0. 0. 0. ... 0. 0. 0.]
 [0. 0. 0. ... 0. 0. 0.]
 [0. 0. 0. ... 0. 0. 0.]]

建立Sequential模型

  • Sequential是一系列网络层按顺序构成的栈
model = Sequential()

通过 .add方法构建网络层

##首先添加第一个输入层,要指定层类型:Dense(全连接),输入个数:input_dim,输出个数:units,激活函数:activation
model.add(Dense(input_dim=28*28, units=500, activation='relu')) #第一层
##添加隐藏层,从第二层开始不需要指定输入个数,只需要输出个数就行,也需要指定激活函数
model.add(Dense(units=500, activation='relu'))
##如果隐藏层添加完了就可以添加最后的输出层了,指定输出个数,由于是分类问题,这里可以使用softmax作为激活函数
model.add(Dense(units=10, activation='softmax'))  #建立输出层

使用.compile()方法来编译模型

  • 当构建完模型后,我们需要使用.compile()方法来编译模型
  • loss:定义一个损失函数,常用交叉熵categorical_crossentropy,均方误差mse等
  • optimizer:优化器,常用随机梯度下降法SGD、Adam等
model.compile(loss='categorical_crossentropy', optimizer='Adam', metrics=['accuracy'])

使用 .fit( )方法训练数据

  • x_train,y_train :训练数据集
  • batch_size :指定一个size表示每次更新一次参数需要从训练集中随机抽取多少个样本,一般越大速度越快
  • epochs :每次使用完所有的训练数据集表示一次epoch
model.fit(x_train, y_train, batch_size=500, epochs=5)
Epoch 1/5
60000/60000 [==============================] - 6s 105us/step - loss: 0.0021 - acc: 0.9998
Epoch 2/5
60000/60000 [==============================] - 7s 112us/step - loss: 0.0017 - acc: 0.9999
Epoch 3/5
60000/60000 [==============================] - 6s 98us/step - loss: 0.0014 - acc: 0.9999
Epoch 4/5
60000/60000 [==============================] - 6s 99us/step - loss: 0.0012 - acc: 1.0000
Epoch 5/5
60000/60000 [==============================] - 6s 101us/step - loss: 0.0010 - acc: 1.0000





<keras.callbacks.History at 0xe82b550>

可以看到结果acc表示在training data上准确度达到100%

使用 .evaluate( )方法计算模型在测试数据集上的效果

result_test = model.evaluate(x_test, y_test, batch_size=500)
print('\nTest Acc:', result_test[1])
10000/10000 [==============================] - 0s 37us/step

Test Acc: 0.9867000043392181

在测试数据集的准确度也达到了98.67%,说明没有过拟合,模型效果不错

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值