【一起入坑AI】手把手 教你用keras实现经典入门案例---手写数字识别

前言

本文分三部分:1、文字讲解 2、代码与结果 3、推荐b站一位up主视频讲解
(默认有一点python基础)该项目虽然相对简单,但是所有深度学习实现过程都大体可以分为文中几步,只不过是网络更复杂,实现的内容更大

实现步骤如下

一、文字讲解

1、加载数据
mnist.load_data()读取出数据存在变量中,它返回两个值,所以加括号
对读出的四个变量进行reshape,astype
归一化操作

2、搭建神经网络
输入层(第0层)不需要自己用add添加,会自动默认创建,写个input_shape即会自动创建
隐藏层默认用relu函数,因为sigmoid函数与tanh函数图像会在输入很大时,表现十分平缓,这样梯度就下降不了,也称之为梯度弥散

二分类与多分类问题(输出层)常用sigmoid函数或者softmax函数,其中softmax得出的是概率

3、神经网络训练
编译(compile):确定优化函数、损失函数、评估函数(metric)
训练(fit):epochs表示训练多少轮,batch_size表示每轮给多大的数据,validation_data=(test_image, test_labels)表示测试集
summary:显示训练每步的epochs与batch_size(即可视化)

4、预测predict与评估evaluate(看训练出的模型对未知数据的预测情况)
用训练出的模型预测少量测试集中图片结果看是否正确,比较预测值(用softmax会出现概率)与真实值(test_label),并且评估基于全部测试集的准确率与损失,evaluate(test_image,test_label)会返回val_loss、val_accuracy

绘图看结果是否符合预期,其中可以利用history对象快速绘图,history字典类型,包含val_loss,val_acc,loss,acc四个key值,分别可以得到测试集与训练集损失和准确率。

5、优化,如正确率不是特别高的情况下,可以增加隐藏层神经元个数,但要保证不要因为神经网络太复杂而出现过拟合。
过拟合现象可以用正则化,其中l2范数效果一般比l1好(最常用kernel_regularizer =regularizers.l2(0.001) ,过拟合程度轻微,参数就用小一点),参数初始化DropOut

最佳结果是,训练集的准确率收敛于测试集的准确率,即若训练集的准确率为96%,测试集为95%,则表示出现轻微过拟合,若训练集为96.1%,测试集为96.7%,则表示效果非常好,因为这样就是训练集收敛于测试集,可以想象一个数轴,无限接近某个数但不能超过,超过就过拟合了。

二、代码与结果

from keras.utils import to_categorical
from keras import layers, models, regularizers,initializers
from keras.optimizers import RMSprop, Adam
from keras.datasets import mnist
import matplotlib.pyplot as plt
import numpy as np

################################################### 1、load and deal
# 加载数据集(训练集中有60000张图片,测试集中有10000张图片,图片大小28×28,28*28的矩阵),第一次加载会自动下载mnist数据集
(train_image, train_labels), (test_image, test_labels) = mnist.load_data()
print(train_image.shape, test_image.shape)
print(train_labels.shape, test_labels.shape)

# 处理数据集
train_image = train_image.reshape(-1, train_image.shape[1] * train_image.shape[2])
test_image = test_image.reshape(-1, test_image.shape[1] * test_image.shape[2])
train_labels = to_categorical(train_labels)  # one_hot变成向量,即一维数组
test_labels = to_categorical(test_labels)

# 归一化
train_image = train_image / 255
test_image = test_image / 255
#################################################### 2、build Neural Network

# 搭建神经网络(3--0,1,2)
model = models.Sequential()
model.add(layers.Dense(units=100, activation="relu", input_shape=(28 * 28,), kernel_regularizer=regularizers.l2(0.01),
                       kernel_initializer=initializers.truncated_normal(mean=0.0, stddev=0.05, seed=None)))
model.add(layers.Dense(units=50, activation="relu", kernel_regularizer=regularizers.l2(0.01),
                       kernel_initializer=initializers.truncated_normal(mean=0.0, stddev=0.05, seed=None)))
model.add(layers.Dense(units=10, activation="softmax"))
#################################################3、build model and train

# 编译模型
Learning_Rate = 0.001
EPOCHS = 25
model.summary()
model.compile(optimizer=Adam(lr=Learning_Rate), loss="categorical_crossentropy",  metrics["accuracy"])

# 训练
H = model.fit(train_image, train_labels, validation_data=(test_image, test_labels), epochs=EPOCHS, batch_size=150, verbose=2)
################################################## 4、predict and evaluate
# 预测
y_pre = model.predict(train_image[:3])
print("预测值: ", y_pre, "\n真实值:", train_labels[:3])
############################################################### 5、draw
# 绘制图像比较结果
N = np.arange(0, EPOCHS)  # 得到一个0,1,2,..,EPOCHS的数组
plt.figure()  # 新建画布
plt.plot(N, H.history["loss"], label="train_loss")	# 通过key值获取loss
plt.plot(N, H.history["val_loss"], label="test_loss")
plt.plot(N, H.history["accuracy"], label="train_acc")
plt.plot(N, H.history["val_accuracy"], label="test_acc")
plt.title("Training loss and accuracy")
plt.xlabel("EPOCH")
plt.ylabel("loss/accuracy")
plt.legend()
plt.show()

Run 后的结果
在这里插入图片描述

在这里插入图片描述

三、b站up主视频讲解

地址: https://b23.tv/BV16g4y1z7Qu

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小样x

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值