机器学习:基于全连接神经网络的MNIST手写数字识别实战

1-前期准备

1,首先需要了解神经网络结构的知识,参考链接: 吃瓜教程学习笔记-CH5神经网络.
2,需要下载keras框架和tensorflow框架,参考链接:Keras环境的安装
基于以上环境和知识的储备,才能更好的理解项目流程。

2-项目流程

一般的深度学习项目的流程分为以下固定步骤:

  1. 数据集的划分
  2. 图片的预处理
  3. 构建网络模型
  4. 模型的编译
  5. 模型的训练
  6. 模型的验证
  7. 模型的优化

模型的优化,减缓过拟合,模型的优化下节进行叙述,本节主要讲述前6个步骤。

3-代码实践

1-数据集的划分

在机器学习中,通常将原始数据集划分成三个部分:

  1. 训练集 training set:用于模型训练
  2. 验证集validation set:用于每次模型训练结束后衡量模型的预测准确度,判断是否过拟合。
  3. 测试集testing set:评估模型

通常情况下,会将数据集分为6:2:2比例
keras框架中有自动划分训练集和验证集的方式。

model.fit(x_train,y_train,validation_split=0.2)

2-图片预处理

在全连接神经网络中,需要对图片进行扁平化处理,再送到构建好的模型中去训练。keras中提供了扁平化操作的层,可以作为全连接神经网络的第一层。
因为MNIST数据集中每一张图片为28*28,扁平化第一层的input_shape=(28,28).
代码如下:

#构建模型
from keras.models import Sequential
from keras.layers import Dense, Flatten
from keras.optimizers import RMSprop
model = Sequential()
model.add(Flatten(input_shape=(28, 28)))

3-网络构建

3个隐藏层,第一个单元数64,其余32,所有的单元使用函数ReLU函数作为激活函数,最后加上输出层。输出层使用softmax函数。

model.add(Dense(units=64, activation='relu'))
model.add(Dense(units=32, activation='relu'))
model.add(Dense(units=32, activation='relu'))
model.add(Dense(units=10, activation='softmax'))
model.summary()

最后输出的模型总结为:
在这里插入图片描述

4-编译

构建好模型之后,对模型进行编译,为了指定衡量模型的预测误差的损失函数。使用RMSprop梯度下降法。

#编译
model.compile(loss='categorical_crossentropy',
              metrics=['accuracy'],
              optimizer=RMSprop())

5-训练

模型构建编译好之后,使用训练集中的数据对模型进行训练,需要指定训练的次数,批尺寸,验证集比例。

#训练
model.fit(X_train,
          y_train,
          epochs=10,
          batch_size=64,
          validation_split=0.2)

训练迭代过程中,会输出平均损失值和平均准确率,准确率最高达到98%。
在这里插入图片描述

6-测试

训练完成之后,使用测试集进行测试:

#测试评估
loss, accuracy = model.evaluate(X_test, y_test)
#输出
print(accuracy)

测试输出准确率结果为97%,小于训练的时候的98%,出现过拟合现象,具体缓解过拟合的方式下节描述。
在这里插入图片描述

4-整体代码

参考自深度学习与项目实战。

#20220328
#加载数据
from keras.datasets import mnist
from keras.utils import to_categorical
(X_train, y_train), (X_test, y_test) = mnist.load_data()
# 将训练集图片进行归一化:将图片中的每一个像素值转变为0~1之间
X_train = X_train / 255.0
X_test = X_test / 255.0
# 将 label转化为独热编码的形式
y_train = to_categorical(y_train)
y_test = to_categorical(y_test)

#构建模型
from keras.models import Sequential
from keras.layers import Dense, Flatten
from keras.optimizers import RMSprop
model = Sequential()
model.add(Flatten(input_shape=(28, 28)))
model.add(Dense(units=64, activation='relu'))
model.add(Dense(units=32, activation='relu'))
model.add(Dense(units=32, activation='relu'))
model.add(Dense(units=10, activation='softmax'))
model.summary()

#编译
model.compile(loss='categorical_crossentropy',
              metrics=['accuracy'],
              optimizer=RMSprop())

#训练
model.fit(X_train,
          y_train,
          epochs=10,
          batch_size=64,
          validation_split=0.2)

#测试评估
loss, accuracy = model.evaluate(X_test, y_test)

#输出
print(accuracy)
  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值