前言
本文分三部分: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