实验六 卷积神经网络CNN框架的实现与应用
一、实验目的
1、掌握卷积神经网络CNN的基本原理
2、利用CNN实现手写数字识别
二、实验原理
利用LeNet-5 CNN框架,实现手写数字识别。其中网络层级结构概述如图2所示,共有7层神经网络。在图2.1中,各网络层参数如下表2.1所示.
表2.1 各网络层参数设置对应表
Input layer
输入数据为原始训练图像32*32
Conv1
6个5*5的卷积核,步长Stride为1
Pooling1
卷积核size为2*2,步长Stride为2
Conv2
12个5*5的卷积核,步长Stride为1
Pooling2
卷积核size为2*2,步长Stride为2
Output layer
输出为10维向量
图2 CNN模型基本框架图
本次实验采用minst数据集,初始图像大小为28*28,采用下表2.2参数搭建CNN模型。
表2.2 各网络层参数设置对应表
Input layer
输入数据为原始训练图像28*28
Conv1
6个5*5的卷积核,步长Stride为1
Pooling1
卷积核size为2*2,步长Stride为2
Conv2
16个5*5的卷积核,步长Stride为1
Pooling2
卷积核size为2*2,步长Stride为2
Flatten()
一个重新调整为 1D 的张量。
Dense(120, activation='tanh')
全连接层
Dense(84, activation='tanh')
全连接层
Dense(10, activation='softmax')
输出为10维向量
三、实验结果
注:由于添加交叉验证会导致训练时间边长,这里采用先确定合适参数再进行交叉验证训练。
衡量实验结果的常用指标如下:
检测率:recall=
查全率:precision=
准确率:arrcuracy=
1、调整学习率、epochs以及bacth_size这三个参数,分别观察参数的变化对于实验结果的影响。
(1)固定参数epochs = 3,batch_size = 128,观察学习率对于正确率的影响,可以发现随着学习率由0.0001逐渐增大时,准确率及其他评价指标都是先上升后下降,运行时间受学
习率的影响不大,变化图见图3.1.1,具体结果见表3.1.1
图3.1.1  学习率对于准确率的影响
表3.1.1  学习率对于准确率的影响
学习率
0.0001
0.001
0.01
0.1
1
运行时间(s)
24.57
25.63
25.34
25.39
25.13
准确率
87.67%
98.07%
98.06%
51. 95%
74.33%
查全率
44.78%
83.86%
84.00%
16.62%
10.83%
检测率
99.76%
99.88%
99.64%
94.73%
21.67%
F1值
0.61
0.91
0.91
0.28
0.14
2固定参数learning_rate=0.001, batch_size = 128,观察epochs对于准确率的影响。
表3.1.2  epochs对于准确率的影响
epochs
1
3
5
7
9
运行时间(s)
10.09
25.51
42.63
60.47
75.75
准确率
67.21%
91.89%
95.96%
97.40%
98.28%
查全率
23.34%
55.24%
71.31%
79.43%
95.39%
检测率
99.78%
99.78%
99.87%
99.94%
99.95%
F1值
0.37
0.71
0.83
0.88
0.92
图3.1.2  epochs对于准确率的影响
3固定参数learning_rate=0.001,epochs=5,观察batch_size对于准确率的影响。
表3.1.3  batch_size对于准确率的影响
batch_size
108
118
128
138
148
运行时间(s)
42.85
44.01
41.20
41.93
41.82
准确率
93.69%
96.53%
97.48%
97.93%
98.22%
查全率
61.35%
74.31%
79.95%
82.94%
85.02%
检测率
99.83%
99.87%
99.89%
99.88%
99.88%
F1值
0.76
0.85
0.88
0.90
0.91
图3.1.3  batch_size对于准确率的影响
2、最终的实验结果
选取参数learning_rate=0.001, batch_size = 148epochs=5,具体的实验结果如表3.2所示:
表3.2  最终实验结果
检测率
查全率
准确率
F1值
99.88%
85.02%
98.22%
0.91
3、采用3折交叉验证
选取参数learning_rate=0.001, batch_size = 148epochs=5,具体的实验结果如表3.3所示:
表3.3  最终实验结果
检测率
查全率
准确率
F1值
99.85%
89.50%
98.79%
0.94
四、实验总结
1、CNN算法步骤
获取训练数据和测试数据;
定义网络层级结构;
初始设置网络参数(权重W,偏向bcnnsetup(cnn, train_x, train_y)
训练超参数opts定义(学习率,batchsizeepoch
网络训练之前向运算cnnff(net, batch_x)
网络训练之反向传播cnnbp(net, batch_y)
网络训练之参数更新cnnapplygrads(net, opts)
重复,直至满足epoch
网络测试cnntest(cnn, test_x, test_y)
2、设计程序流程图
图4.2  程序流程图
3、试分析mnist数据集X_train、X_test以及相对应的Y_train、Y_test
表4.3  数据集分析表
X_train
X_test
Y_train
Y_test
原始数据shape
60000*28*28
10000*28*28
60000*1
10000*1
处理后shape
60000*28*28*1
10000*28*28*1
60000*10
10000*10
4、交叉验证及衡量指标部分代码:
注:由于添加交叉验证会导致训练时间边长,这里采用先确定合适参数再进行交叉验证训练。
# 合为一个数据,进行交叉验证
data = np.row_stack((x_train,x_test))
target = np.row_stack((y_train,y_test))
for train, test in kf.split(data):
    model.fit(data[train], target[train],batch_size=batch_size,epochs=epochs, verbose=1,validation_data=(data[test], target[test]),callbacks=[history])
#测试
    y_predict = model.predict(data[test], batch_size=512, verbose=1)
# y_predict = (y_predict > 0.007).astype(int)
    y_predict = (y_predict > 0.01).astype(int)
validation框架    y_true = np.reshape(target[test], [-1])
    y_pred = np.reshape(y_predict, [-1])
# 评价指标
    accuracy.append(accuracy_score(y_true, y_pred))#正确率,查准率,预测对的样本数占样本总数的比例
    precision.append(precision_score(y_true, y_pred))#精度,查全率,预测为正的样本中实际正样本的比例
    recall.append(recall_score(y_true, y_pred, average='binary'))#实际正样本中预测为正的概率
    f1score.append(f1_score(y_true, y_pred, average='binary'))
    # Micro F1: 将n分类的评价拆成n个二分类的评价,将n个二分类评价的TP、FP、RN对应相加,计算评价准确率和召回率,由这2个准确率和召回率计算的F1 score即为Micro F1。
        micro_f1 = f1_score(y_true, y_pred,average='micro')