这是人工智能实验的最后一个实验,算是深度学习的“hello world”。经过之前的学习,利用LeNet-5实现手写数字识别已经不是难事,而且准确率极高。
本次实验的主要目的就是引入了3折交叉验证,对比一下在不同的epochs、batch_size以及优化器下,模型准确率的变化。
1.实验内容
- 数据集:MNIST 数据集,60000 张训练图像,10000 张测试图像,每张图像size 为 28*28。
- 利用 LeNet-5 CNN 框架,实现手写数字识别。
2.实验要求
- 利用交叉验证方法,分析识别结果。
- 分析网络参数 opts 设置对最终识别结果的影响,画出相应的结果分析图。
3.代码实现
导入库
import numpy as np
import tensorflow as tf
import matplotlib.pyplot as plt
import os
from sklearn.model_selection import KFold
import warnings
warnings.filterwarnings("ignore")#忽略警告信息
plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号
os.environ['TF_CPP_MIN_LOG_LEVEL']='2'
数据准备
def Get_data():
(x_train,y_train),(x_test,y_test) = tf.keras.datasets.mnist.load_data()
x_train = x_train.reshape(x_train.shape[0],28,28,1).astype('float32')
x_test = x_test.reshape(x_test.shape[0],28,28,1).astype('float32')
x_train,x_test = x_train / 255.0,x_test / 255.0#归一化
#进行one-hot编码
y_train = tf.one_hot(y_train,depth=10)
y_test = tf.one_hot(y_test,depth=10)
#将训练集与测试集堆叠到一起,方便后面的交叉验证
data = np.row_stack((x_train,x_test))
label = np.row_stack((y_train,y_test))
return data,label
模型搭建
参照LeNet-5网络模型的参数,搭建网络。
def Get_model():
model = tf.keras.models.Sequential([
tf.keras.layers.Conv2D(filters=6,kernel_size=(5,5),strides=1,activation='relu',padding="same",input_shape=(28,28,1)),
tf.keras.layers.MaxPooling2D(pool_size=(