实验六 卷积神经网络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 = 148,epochs=5,具体的实验结果如表3.2所示:
表3.2 最终实验结果
检测率 | 查全率 | 准确率 | F1值 |
99.88% | 85.02% | 98.22% | 0.91 |
3、采用3折交叉验证
选取参数learning_rate=0.001, batch_size = 148,epochs=5,具体的实验结果如表3.3所示:
表3.3 最终实验结果
检测率 | 查全率 | 准确率 | F1值 |
99.85% | 89.50% | 98.79% | 0.94 |
四、实验总结
1、CNN算法步骤
获取训练数据和测试数据;
定义网络层级结构;
初始设置网络参数(权重W,偏向b)cnnsetup(cnn, train_x, train_y)
训练超参数opts定义(学习率,batchsize,epoch)
网络训练之前向运算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') |
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论