目录
实验六 卷积神经网络CNN框架的实现与应用
一、实验目的
二、实验原理
三、实验结果
1、调整学习率、epochs以及bacth_size这三个参数,分别观察参数的变化对于实验结果的影响。
2、最终的实验结果
3、采用3折交叉验证
四、实验总结
1、CNN算法步骤
2、设计程序流程图
3、试分析mnist数据集X_train、X_test以及相对应的Y_train、Y_test。
4、交叉验证及衡量指标部分代码:
5、实验过程中建立的Lenet5模型中各个参数及卷积核的个数见下图4.4,核心代码如下,具体代码见附件。
附录
源码
推荐文章
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维向量 |
注:由于添加交叉验证会导致训练时间边长,这里采用先确定合适参数再进行交叉验证训练
衡量实验结果的常用指标如下:
检测率:
查全率:
准确率:
(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对于准确率的影响
选取参数learning_rate=0.001, batch_size = 148,epochs=5,具体的实验结果如表3.2所示:
表3.2 最终实验结果
检测率 |
查全率 |
准确率 |
F1值 |
99.88% |
85.02% |
98.22% |
0.91 |
选取参数learning_rate=0.001, batch_size = 148,epochs=5,具体的实验结果如表3.3所示:
表3.3 最终实验结果
检测率 |
查全率 |
准确率 |
F1值 |
99.85% |
89.50% |
98.79% |
0.94 |
Step1 获取训练数据和测试数据;
Step2 定义网络层级结构;
Step3 初始设置网络参数(权重W,偏向b)cnnsetup(cnn, train_x, train_y)
Step4训练超参数opts定义(学习率,batchsize,epoch)
Step5网络训练之前向运算cnnff(net, batch_x)
Step6 网络训练之反向传播cnnbp(net, batch_y)
Step7 网络训练之参数更新cnnapplygrads(net, opts)
Step8 重复Step5 Step6 Step7,直至满足epoch
Step9 网络测试cnntest(cnn, test_x, test_y)
图4.2 程序流程图
表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 |
注:由于添加交叉验证会导致训练时间边长,这里采用先确定合适参数再进行交叉验证训练。
# 合为一个数据,进行交叉验证 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) 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') |
# 建立模型 model = Sequential() # lenet-5 model.add(Convolution2D(filters=6, kernel_size=(5, 5), padding='valid', input_shape=(img_rows, img_cols, 1), activation='tanh')) model.add(MaxPooling2D(pool_size=(2, 2)))#步长为2 model.add(Convolution2D(filters=16, kernel_size=(5, 5), padding='valid', activation='tanh')) model.add(MaxPooling2D(pool_size=(2, 2))) model.add(Flatten()) model.add(Dense(120, activation='tanh')) model.add(Dense(84, activation='tanh')) model.add(Dense(n_classes, activation='softmax')) model.summary() model.compile(optimizer=Adam(lr=learning_rate), loss='categorical_crossentropy',metrics=['accuracy']) history = LossHistory()#显示回调函数,看看到底执行了什么,我的参数如何设置的 model.fit(x_train, y_train,batch_size=batch_size,epochs=epochs, verbose=1,validation_data=(x_test, y_test),callbacks=[history]) |
图4.5 模型参数的设置
np_utils.to_categorical使用方法:https://www.cnblogs.com/lhuser/p/90730 12.html
https://download.csdn.net/download/weixin_43442778/16053604
欢迎大家关注【小果果学长】微信公众号,获取更多资料和源码,期待你的点赞和支持!