下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
实验3卷积神经网络(CNN)手写数字识别一、实验目的及要求理解卷积神经网络(CNN)的核心思想:局部连接、权值共享、卷积、池化与平移不变性。掌握使用Keras/TensorFlow构建LeNet-5风格CNN的方法。能够对比CNN与MLP在手写数字识别任务上的性能差异,理解CNN在图像任务中的优势。理解CNN的层次化特征学习:浅层学习边缘,中层学习部件,深层学习语义。培养对我国计算机视觉自主创新成果的关注与兴趣。二、实验学时3学时(建议时间分配:讲解15分钟,任务实践130分钟,总结报告15分钟)三、实验前准备软件环境:Python3.8及以上,建议使用JupyterNotebook或VSCode。依赖库:NumPy、Matplotlib、TensorFlow(包含Keras)。安装命令如下:pipinstallnumpymatplotlibtensorflow知识储备:已学习教材第6.3节(卷积神经网络)内容,了解卷积、池化、局部连接与权值共享。说明:TensorFlow安装包较大,建议课前完成安装并验证`importtensorflowastf`无报错;数据集使用scikit-learn内置的load_digits,无需联网下载。在JupyterNotebook中运行绘图代码前,建议先执行`%matplotlibinline`,以保证图像正常显示。四、实验任务任务1加载与预处理手写数字数据(15分钟)使用sklearn.datasets.load_digits加载手写数字数据;将像素值归一化到[0,1];增加通道维度;标签保持整数类型。任务2构建LeNet-5风格CNN(30分钟)搭建网络:卷积层(16个3×3卷积核)→最大池化→卷积层(32个3×3卷积核)→最大池化→展平→全连接层(64)→输出层(10)。理解每一层的作用。任务3训练与评估模型(50分钟)使用Adam优化器和sparse_categorical_crossentropy损失函数训练模型;记录训练过程中的损失与准确率;在测试集上评估最终性能。任务4与MLP对比(15分钟)记录CNN的测试准确率;与实验七中MLP的结果进行对比,分析CNN如何利用局部连接与权值共享提升图像分类效果。任务5可视化卷积核与特征图(20分钟)抽取第一个卷积层的部分卷积核进行可视化;选择一张测试样本,观察其在第一个卷积层输出的特征图,理解CNN如何检测边缘等低级特征。参考代码以下为完整可运行代码。完整训练通常只需十几秒到一分钟(取决于硬件):#实验八:卷积神经网络(CNN)手写数字识别
importwarnings
warnings.filterwarnings('ignore')
importnumpyasnp
importmatplotlib.pyplotasplt
importtensorflowastf
fromtensorflowimportkeras
fromtensorflow.kerasimportlayers
fromsklearn.datasetsimportload_digits
fromsklearn.model_selectionimporttrain_test_split
fromsklearn.metricsimportaccuracy_score,classification_report
#设置中文字体
plt.rcParams['font.sans-serif']=['SimHei','MicrosoftYaHei','ArialUnicodeMS']
plt.rcParams['axes.unicode_minus']=False
print("TensorFlow版本:",tf.__version__)
#1.加载手写数字数据集(load_digits为scikit-learn内置数据集,无需联网)
print("正在加载手写数字数据集...")
digits=load_digits()
X=digits.images.astype('float32')/16.0#像素值范围0-16,归一化到[0,1]
y=digits.target
X=np.expand_dims(X,-1)#增加通道维度->(1797,8,8,1)
print(f"样本数:{X.shape[0]},图像尺寸:{X.shape[1:4]},类别数:{len(np.unique(y))}")
#2.划分训练集与测试集
X_train,X_test,y_train,y_test=train_test_split(
X,y,test_size=0.2,random_state=42,stratify=y
)
print(f"训练样本数:{X_train.shape[0]},测试样本数:{X_test.shape[0]}")
#3.构建CNN模型
model=keras.Sequential([
layers.Input(shape=(8,8,1)),
layers.Conv2D(16,(3,3),activation='relu',padding='same',name='conv1'),
layers.MaxPooling2D((2,2)),
layers.Conv2D(32,(3,3),activation='relu',padding='same',name='conv2'),
layers.MaxPooling2D((2,2)),
layers.Flatten(),
layers.Dense(64,activation='relu'),
layers.Dense(10,activation='softmax')
])
model.summary()
pile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
#4.训练
print("\n开始训练CNN...")
history=model.fit(X_train,y_train,epochs=15,batch_size=32,
validation_split=0.1,verbose=1)
#5.评估
test_loss,test_acc=model.evaluate(X_test,y_test,verbose=0)
print(f"\n测试集准确率:{test_acc:.4f}")
y_pred=model.predict(X_test,verbose=0)
y_pred_labels=np.argmax(y_pred,axis=1)
print("\n分类报告:")
print(classification_report(y_test,y_pred_labels))
#6.绘制训练曲线
plt.figure(figsize=(12,5))
plt.subplot(1,2,1)
plt.plot(history.history['loss'],label='训练损失')
plt.plot(history.history['val_loss'],label='验证损失')
plt.xlabel('Epoch')
plt.ylabel('Loss')
plt.title('损失曲线')
plt.legend()
plt.grid(True)
plt.subplot(1,2,2)
plt.plot(history.history['accuracy'],label='训练准确率')
plt.plot(history.history['val_accuracy'],label='验证准确率')
plt.xlabel('Epoch')
plt.ylabel('Accuracy')
plt.title('准确率曲线')
plt.legend()
plt.grid(True)
plt.show()
#7.可视化第一个卷积层的部分卷积核
conv1_weights=model.get_layer('conv1').get_weights()[0]
plt.figure(figsize=(8,4))
foriinrange(16):
plt.subplot(2,8,i+1)
plt.imshow(conv1_weights[:,:,0,i],cmap='gray')
plt.axis('off')
plt.suptitle('第一个卷积层前16个卷积核')
plt.tight_layout()
plt.show()
#8.可视化某张测试样本在conv1输出的特征图
sample=X_test[0:1]
conv1_output_model=keras.Model(inputs=model.layers[0].input,
outputs=model.get_layer('conv1').output)
feature_maps=conv1_output_model.predict(sample,verbose=0)[0]
plt.figure(figsize=(10,4))
plt.subplot(1,9,1)
plt.imshow(sample[0,:,:,0],cmap='gray')
plt.title('原图')
plt.axis('off')
foriinrange(8):
plt.subplot(1,9,i+2)
plt.imshow(feature_maps[:,:,i],cmap='gray')
plt.title(f'特征图{i+1}')
plt.axis('off')
plt.suptitle('输入样本与第一个卷积层特征图')
plt.tight_layout()
plt.show()预期结果(参考)在1,437条训练样本上训练15个epoch,测试集准确率通常可达0.95–0.97,与同规模MLP相比参数量更少且性能相近。训练损失和验证损失同步下降,准确率快速上升。卷积核可视化可观察到边缘、笔画等低级特征检测器;特征图显示网络在数字笔画处响应较强。结果记录表项目MLP(实验七)CNN(本实验)对比分析测试准确率CNN通常更高训练时间与硬件相关输入处理方式64维向量8×8×1张量CNN保留空间结构参数规模CNN通常更少对平移的鲁棒性CNN更强五、实验重点、难点重点:CNN的网络结构(卷积→池化→展平→全连接)、局部连接与权值共享、卷积核与特征图的可视化。难点:理解卷积运算的滑动点积过程、池化层的作用、CNN为何比MLP更适合图像任务。六、操作要点TensorFlow安装包较大,建议课前完成安装;若使用AppleSiliconMac,可安装tensorflow-macos或tensorflow-metal以加速。本实验使用scikit-learn内置的load_digits数据集(1,437条训练样本),建议训练15个epoch;课后可尝试MNIST等更大规模数据。model.summary()可查看每层输出形状和参数量,建议结合教材中的“参数爆炸”问题进行分析。可视化特征图时,选择边缘清晰的样本效果更明显。七、注意事项输入数据的通道维度必须正确:load_digits图像为(8,8,1),MNIST图像为(28,28,1),彩色图为(H,
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026挪威生物科技行业市场现状供需层次分析及投资评价布局发展报告
- 2026生物医药原料药行业现状供需趋势分析及投资评估规划研究
- 2026叶黄素酯在抗衰老产品中的应用市场前景研究
- 2026中国新型建筑材料技术突破与市场发展潜力研究报告
- CPR工作坊理论考试卷含答案
- 2026欧盟3D打印技术应用医疗行业市场拓展趋势分析投资周期测算建议
- 2026中国智能健康监护设备制造业市场竞争态势及投资开发评估规划分析报告
- 2026评估规划行业市场风险需求竞争格局发展评估报告
- 2026中国新能源汽车产业链全景调研及投资前景预测报告
- 伊宁英阿亚提玫瑰友谊学校一年级数学加减法练习题
- 2026年交管12123驾驶证学法减分试题(含参考答案)
- 2025年临沂市公安机关招录警务辅助人员笔试真题
- 部编版五升六语文暑假衔接作业完整版 基础巩固+新知预习含答案可打印
- 2026年(完整版)国家GCP培训考试题库及参考答案(完整版)
- 2026年廊坊银行人员招聘笔试备考试题及答案详解
- (2026年)手卫生规范与职业防护培训课件
- 幼儿园保健医岗位职责培训试题及答案
- 从零开始学量价分析(短线操盘-盘口分析与A股买卖点实战)
- PCI术后血脂管理
- 睡眠呼吸障碍合并哮喘的诊疗策略-1
- 焦煤集团5MW10MWh储能技术方案
评论
0/150
提交评论