尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

Python卷积神经网络CNN图像分类毕设:TensorFlow与PyTorch双框架实战

发布时间:2026/9/24 18:17:10

资讯中心
01
ARTICLE

Python卷积神经网络CNN图像分类毕设:TensorFlow与PyTorch双框架实战

Python卷积神经网络CNN图像分类毕设:TensorFlow与PyTorch双框架实战
简介这份资源是面向高校计算机相关专业毕业设计场景的完整项目包围绕Python卷积神经网络CNN实现图像分类系统展开适合正在准备毕设、需要可运行参考项目的学生以及希望系统梳理CNN经典网络结构的学习者。包内共21个文件以13个Python源码文件为核心辅以训练好的模型与数据集、说明文档、前端页面及配置文件压缩包约62KB体量轻便、便于本地部署与二次修改。项目覆盖LeNet-5、AlexNet、GoogLeNet、ResNet等经典网络并同时提供TensorFlow与PyTorch两套实现配合类别索引文件与模型脚本可帮助读者理解从数据加载、网络搭建到训练推理的完整链路。源码均经本地编译验证可运行评审分达95分以上难度适中内容经助教老师审定。目前已有269人学习下载适合作为毕设参考或CNN入门实践素材。1. 从一份能跑通的 CNN 图像分类毕设说起很多同学做图像分类毕设时卡点从来不是「CNN 是什么」而是「代码跑不起来、模型加载报错、答辩被问训练细节答不上」。这份基于 Python 卷积神经网络 CNN 的图像分类系统把源码、训练好的模型、说明文档和全部数据资料打包在一起本地编译过、可直接运行评审分 95 分以上难度适中。它同时给了 TensorFlow 和 PyTorch 两套实现覆盖 LeNet-5、AlexNet、GoogLeNet、ResNet 四类经典网络还带一个 Flask 的 APP 演示界面。适合正在做图像分类方向毕设、需要一份能讲清原理又能当场演示的完整工程的同学也适合想快速对比不同 CNN 结构差异的入门者。2. 拆开压缩包目录结构与两套框架的选型逻辑拿到资源先别急着跑main.py先把目录看明白否则后面模型加载、路径报错全是玄学。这份资源的目录结构其实已经把设计意图写在了脸上CNN--main是主工程数据集与训练好的模型单独存放APP是 Web 演示model.py定义网络Matrix.py大概率是混淆矩阵或评估指标class_indices.json是类别索引映射README.md是说明文档。TensorFlow 和 PyTorch 各有一套 LeNet-5、AlexNet、GoogLeNet、ResNet说明作者是刻意让你做横向对比的。2.1 目录逐层说明与关键文件职责把压缩包解压后根目录大致是这样几块路径作用是否要改CNN--main/主工程入口含main.py、model.py、Matrix.py按需改路径数据集与训练好的模型/训练集、验证集与.h5/.pth权重一般不动APP/Flask 应用含templates/、static/改端口时动class_indices.json类别名到索引的映射换数据集必改README.md环境、运行、参数说明先读.gitattributesGit 属性配置可忽略model.py是核心四类网络大概率都以函数或类的方式写在这里main.py负责训练和推理的调度Matrix.py负责出混淆矩阵。class_indices.json这个文件特别关键它决定了模型输出第 0 类到底对应「猫」还是「狗」换数据集时如果忘了同步改它预测结果会整体错位这是新手最容易翻车的地方。2.2 TensorFlow 与 PyTorch 两套实现的取舍资源里两套框架都给了不是凑数。TensorFlow 那套更适合直接跑通、导出.h5权重、配合 Flask 做演示因为 Keras 的model.predict接口对新手友好PyTorch 那套更适合你答辩时讲「我改了哪一层、为什么这么改」因为nn.Module的结构写起来更直观forward函数一眼能看清数据流向。常见做法是先用 TensorFlow 版本把整个流程跑通确认数据集、类别映射、评估指标都对再切到 PyTorch 版本做结构实验。如果你毕设要求「有对比实验」正好用这两套跑同一份数据把 LeNet-5 到 ResNet 的准确率拉一张表这就是现成的实验章节素材。2.3 环境准备与依赖安装先确认 Python 版本这类工程一般跑在 3.73.10 之间太新的版本反而容易因为 TensorFlow 或 PyTorch 的兼容问题报错。建议单独建虚拟环境别污染系统环境# 创建并激活虚拟环境避免和系统里的包打架 python -m venv cnn_env # Windows cnn_env\Scripts\activate # macOS / Linux source cnn_env/bin/activate # 安装核心依赖版本以 README 为准这里给常见组合 pip install tensorflow2.10.0 pip install torch torchvision pip install flask opencv-python numpy matplotlib scikit-learn逻辑说明虚拟环境是为了隔离依赖tensorflow和torch是两套框架的核心flask支撑 APP 演示opencv-python负责图像读取和预处理scikit-learn用来出混淆矩阵和分类报告。参数上TensorFlow 2.10 是最后一个原生支持 Windows GPU 的版本之一如果你机器没有 NVIDIA 显卡装 CPU 版即可训练会慢但能跑通。装完先python -c import tensorflow; print(tensorflow.__version__)验证一下别等到训练时报ImportError才回头查。3. 把模型跑起来训练、推理与 Flask 演示的完整链路环境好了接下来是真正让它动起来。这一章按「训练 → 评估 → 推理 → Web 演示」的顺序走每一步都给你能抄的命令和参数说明。跑通这条链路你的毕设演示部分基本就稳了。3.1 训练脚本的启动与关键参数训练入口一般在main.py不同框架的启动方式略有差异。先看 TensorFlow 版本# 进入主工程目录 cd CNN--main # 启动训练epochs 和 batch_size 按机器性能调 python main.py --mode train --epochs 30 --batch_size 32 --lr 0.001逻辑说明--mode train指定训练模式--epochs 30是训练轮数--batch_size 32是每批样本数--lr 0.001是学习率。参数怎么改小数据集几千张以内epochs 给 2030 就够再多容易过拟合batch_size 受显存限制8G 显存跑 ResNet 建议 16 或 32学习率 0.001 是 Adam 的常用起点如果 loss 一直不降先降到 0.0001 试。如果脚本没有 argparse 而是写死的就打开main.py找到epochs、batch_size直接改。PyTorch 版本类似但通常会有单独的train.py# PyTorch 训练注意 device 参数 python train.py --epochs 30 --batch_size 32 --lr 0.001 --device cuda--device cuda表示用 GPU没有显卡就改成cpu。这一步最常见的报错是CUDA out of memory解决办法就是把 batch_size 减半别硬扛。3.2 用训练好的模型做单张推理资源里带了训练好的模型意味着你可以跳过训练直接验证。推理脚本通常长这样import json import numpy as np from tensorflow.keras.models import load_model from tensorflow.keras.preprocessing import image # 加载模型和类别映射两者必须配套 model load_model(数据集与训练好的模型/resnet_model.h5) with open(class_indices.json, r, encodingutf-8) as f: class_indices json.load(f) # 反转字典从索引查类别名 idx_to_class {v: k for k, v in class_indices.items()} # 读取并预处理图片尺寸要和训练时一致 img image.load_img(test.jpg, target_size(224, 224)) x image.img_to_array(img) / 255.0 x np.expand_dims(x, axis0) # 预测并取最大概率类别 preds model.predict(x) pred_idx np.argmax(preds) print(预测类别:, idx_to_class[pred_idx], 置信度:, preds[0][pred_idx])逻辑说明load_model加载权重class_indices.json提供索引到类别名的映射target_size(224, 224)必须和训练时的输入尺寸一致ResNet 通常是 224LeNet-5 可能是 32。img_to_array后除以 255 是做归一化这一步漏了模型输出会完全乱掉。np.expand_dims是加一个 batch 维度因为predict期望输入是(N, H, W, C)。参数上如果你换了自己的图片只要保证尺寸和归一化方式一致即可。3.3 Flask APP 的启动与接口调试APP目录是演示界面答辩时比命令行有说服力。启动方式# 进入 APP 目录 cd APP # 启动 Flask指定 host 和 port python app.py # 或显式指定 flask run --host0.0.0.0 --port5000逻辑说明app.py里一般会加载模型、定义上传接口和预测路由templates/放 HTML 页面static/放 CSS 和 JS。--host0.0.0.0让局域网内其他设备也能访问方便你用手机传图演示。启动后浏览器打开http://127.0.0.1:5000上传图片就能看到预测结果。常见坑是模型路径写的是相对路径从APP目录启动时找不到模型解决办法是把模型路径改成绝对路径或者把模型文件复制到APP目录下。3.4 评估指标混淆矩阵与分类报告Matrix.py大概率就是干这个的。跑评估一般需要验证集和标签from sklearn.metrics import confusion_matrix, classification_report import matplotlib.pyplot as plt import seaborn as sns # y_true 是真实标签y_pred 是模型预测标签 cm confusion_matrix(y_true, y_pred) print(classification_report(y_true, y_pred, target_namesclass_names)) # 画混淆矩阵热力图 plt.figure(figsize(10, 8)) sns.heatmap(cm, annotTrue, fmtd, cmapBlues, xticklabelsclass_names, yticklabelsclass_names) plt.xlabel(预测) plt.ylabel(真实) plt.savefig(confusion_matrix.png)逻辑说明confusion_matrix给出每个类别的误判分布classification_report给出精确率、召回率、F1。参数上target_names要和class_indices.json的顺序一致否则图上的类别名会错位。这张图放进毕设论文的「实验结果与分析」章节比只写一个准确率数字有说服力得多。4. 避坑与排查模型跑不通时先看这几条这一章是我自己踩过、也见过别人反复踩的坑按「现象 → 原因 → 解决」写遇到问题先对照排查能省下大量瞎试的时间。4.1 报错No module named tensorflow或版本冲突现象明明装了 TensorFlow运行还是提示找不到模块或者导入时报ImportError: DLL load failed。原因多半是虚拟环境没激活或者装了和 Python 版本不匹配的 TensorFlow。解决先which pythonWindows 用where python确认当前解释器是不是虚拟环境里的再pip list看 TensorFlow 版本。Python 3.11 装 TensorFlow 2.10 会失败要么降 Python 版本要么升 TensorFlow但升了可能和工程代码不兼容稳妥做法是按 README 指定的版本组合来。4.2 模型加载报Unable to open file或KeyError现象load_model报找不到文件或者加载后预测时报KeyError。原因路径写的是相对路径而你的工作目录和脚本不在同一层KeyError则是class_indices.json的索引和模型输出对不上。解决把模型路径改成绝对路径或者用os.path.dirname(__file__)拼路径KeyError就打开class_indices.json核对键值确认索引从 0 开始且和训练时一致。换过数据集的话这个文件必须重新生成。4.3 预测结果全是同一类现象不管传什么图模型都输出同一个类别置信度还很高。原因输入预处理和训练时不一致最常见的是忘了归一化或者图片通道顺序搞反RGB 和 BGR。解决检查推理代码里有没有/ 255.0检查target_size是否和训练一致用 OpenCV 读图的话记得cv2.cvtColor(img, cv2.COLOR_BGR2RGB)转一下。这个坑很隐蔽因为模型不报错只是结果错属于典型的「静默翻车」。4.4 Flask 启动后上传图片报 500现象页面能打开一上传图片就 500 错误。原因多半是app.py里模型加载失败或者上传目录没有写权限。解决看 Flask 控制台的 traceback如果是模型路径问题就改绝对路径如果是权限问题检查static/uploads之类的目录是否存在、是否可写。另外注意 Flask 默认限制上传大小大图可能被拒需要设置app.config[MAX_CONTENT_LENGTH]。4.5 GPU 显存不足或训练中途崩溃现象训练跑几轮后报CUDA out of memory或者进程被系统杀掉。原因batch_size 太大或者数据加载时没有及时释放。解决把 batch_size 减半ResNet 这类深网络在 8G 显存上建议从 16 起步如果还不行用torch.cuda.empty_cache()或 TensorFlow 的tf.keras.backend.clear_session()清理。CPU 训练的话注意内存占用数据量大的时候用生成器而不是一次性加载。5. 进阶玩法用这套工程做对比实验和迁移学习跑通只是起点这套资源真正的价值在于它给了你一个现成的对比实验平台。四类网络、两套框架稍微改几行就能出一组像样的实验数据答辩时直接甩表格。5.1 四类网络的横向对比实验把 LeNet-5、AlexNet、GoogLeNet、ResNet 在同一份数据上各跑一遍记录准确率、训练时间、参数量做成表网络输入尺寸参数量级适合场景LeNet-532×32约 6 万小图、手写体AlexNet224×224约 6000 万中等规模分类GoogLeNet224×224约 700 万注重效率ResNet224×224千万到亿级深层、高精度操作上把main.py里的模型名参数换一下或者直接改model.py里调用的网络函数重新训练即可。注意输入尺寸要跟着网络变LeNet-5 用 32×32其余用 224×224改尺寸的同时别忘了改数据预处理里的target_size。5.2 迁移学习换自己的数据集如果你毕设的数据集和资源自带的不一样最省事的做法是迁移学习。以 ResNet 为例from tensorflow.keras.applications import ResNet50 from tensorflow.keras import layers, models # 加载预训练权重去掉顶层分类头 base ResNet50(weightsimagenet, include_topFalse, input_shape(224, 224, 3)) # 冻结主干只训练自己加的分类层 base.trainable False model models.Sequential([ base, layers.GlobalAveragePooling2D(), layers.Dense(256, activationrelu), layers.Dropout(0.5), layers.Dense(num_classes, activationsoftmax) # num_classes 换成你的类别数 ]) model.compile(optimizeradam, losscategorical_crossentropy, metrics[accuracy])逻辑说明include_topFalse去掉 ImageNet 的 1000 类分类头base.trainable False冻结预训练权重只训练后面加的层。num_classes换成你自己数据集的类别数Dropout(0.5)防过拟合。数据量少的时候每类几百张冻结主干训练几轮就能到不错的准确率数据量够大再解冻部分层做微调。参数上学习率可以降到 0.0001因为预训练权重已经很好大学习率反而会破坏它。5.3 一个我常用的验证习惯每次改完模型结构或预处理我不会直接跑完整训练而是先拿 20 张图做一次前向传播确认输出维度、类别映射、置信度分布都正常再开正式训练。这个习惯帮我省过很多次「训练两小时才发现标签错位」的时间。从那以后我每次动数据管道都强制先跑一遍小样本 sanity check确认无误再上全量。希望帮到你。本文还有配套的精品资源点击获取
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。