基于Python实现CNN卷积神经网络【100010087】
CNN卷积神经网络
实验内容和要求
- 编写程序,实现 LeNet-5 卷积神经网络,对 MNIST 手写数字数据库进行训练与识别,展示准确率等。
- 自己选择神经网络,对 CIFAR-10 数据库进行图像物体训练与识别。
实验器材
Python 3.7
开发平台:Windows10 Visual Studio Code
机器学习库:torch 1.6.0 torchvision 0.7.0
辅助:CUDA 10.2,用于进行 GPU 加速
具体实现
3.1 LeNet-5 实现
使用 torch 的 nn.Module 类的派生,可以编写 LeNet5 的结构如下:其中调用 nn.Conv2d()函数进行卷积层设置,用 nn.Linear()函数进行全连接操作。在正向传导的过程中,规定了两次池化,使用 F.max_pool2d 函数。每一经过一层,对结果调用 F.relu()函数进行激活,形成新的输出。
在实现卷积神经网络的过程中,调用 pytorch 的数据加载模块的部分是遇到的一个难点。调用 torch.utils.data.DataLoader(),设定批的大小,是否随机重组,以及 num_workers(进程数),由于使用的是 Windows 所以对多线程支持的并不好。
训练过程:使用优化函数 optimizer(选用 Adam 算法)和损失函数(交叉熵函数 CrossEntropyLoss),对 loss 调用 backard()函数进行反向传播过程。注意在训练前对网络进行 train()设置,启用 batchnormalization 和 dropout,防止网络过拟合。
测试过程:启用 eval()模式,对输入数据进入网络进行传播,对输出的 output 取极大值作为预测结果 pred。
3.2 AlexNet 实现
网络定义如下图:
注意在训练前也要对数据先做预处理,利用 torchvision 的处理函数进行 resize 和转换成张量(tensor)的处理。另外调用 Normalize 函数,将原来的 tensor 从(0,1) 变换到(-1,1)区间。
对 CIFAR-10 的训练和检测与 MNIST 的思想是类似的,不再赘述。
实验结果与分析
4.1 LeNet-5 对 MNIST 的训练与识别
设置 BATCH_SIZE 为 512,总共训练 10 个 epoch。每次一个 epoch 在过完一遍训练数据之后再过一遍测试数据,得到一次准确度和损失函数的值。训练和测试的输出结果保存在 LeNet.log 里,模型保存为 LeNet.pth。
对训练结果进行可视化处理如下:
4.2 AlexNet 对 CIFAR-10 的训练与识别
设置 BATCH_SIZE 为 32,总共训练 20 个 epoch。每次一个 epoch 在过完一遍训练数据之后再过一遍测试数据,得到一次准确度和损失函数的值。训练和测试的输出结果保存 AlexNet.log 里,模型保存为 AlexNet.pth。
因为 AlexNet 网络比较复杂,而且 CIFAR-10 数据量也较大,现将训练的网络结构打印如下验证是否正确:
我们对训练后的结果先随机选择一批数据进行测试:
对比实际标签和预测标签:在 32 张图中正确判断了 27 张,正确率约为 84%。
GroundTruth: cat ship ship airplane frog frog automobile frog cat automobile airplane truck dog horse truck ship dog horse ship frog horse airplane deer truck
dog bird deer airplane truck frog frog dog
Predicted: cat ship ship airplane frog frog truck frog cat automobile airplane truck dog horse truck ship dog horse ship frog horse bird airplane truck deer frog deer airplane truck frog frog dog
另外,在五万张训练数据中测试的结果显示正确率为 92%,在一万张新的测试数据中的结果为 77%。在十个标签中,正确率最高的 ship 达到了 91%,最低的 cat 也有近六成的判断正确率。
心得与体会
我之前曾经用过 tensorflow 做过 MNIST 的识别,所以这次使用了 torch 这一工具,拓展一下视野和能力。torch 在对于小型网络方面的编写和运算都要比 tensorflow 快,适合轻量开发。
在跑 AlexNet 的时候,因为数据量大,网络层数多,计算量很大,用 CPU 跑的话要炸掉。所以花了很长时间配置 CUDA 和 pytorch 的 gpu 加速版本适配。但是最后很遗憾的发现 Windows 对于多线程支持很差,所以虽然有所提速,但还是跑的很慢很慢。最终用了大概五六个小时才得到网络模型,而且模型文件竟然有 200 多 M(就不附在上交的压缩文件里了)。以后要加速还是要用 Linux 啊。
编写的过程是简单的,对照着参考论文和示意图一步一步设定网络的层的功能和参数即可,训练和识别的过程大同小异,需要根据不同的数据类别加以调整即可。
通过本次实验,再次体验了 CNN 网络的训练和测试流程与原理,进一步理解的 CNN 的 pipeline,对机器学习有了初步了解。
♻️ 资源
大小: 855KB
➡️ 资源下载:https://download.csdn.net/download/s1t16/87274333
相关文章
- Python程序 #!/usr/bin/python 的解释
- Python使用numpy实现BP神经网络
- [LINK]Python服务器开发一:python基础
- Python语言学习:在python中,如何获取变量的本身字符串名字而非其值/内容及其应用(在代码中如何查找同值的所有变量名)
- Python:利用python语言实现18位身份证号码和15位身份证号码相互转换
- Python之tkinter:动态演示调用python库的tkinter带你进入GUI世界(Button的command/Label/PhotoImage/封装为类)
- Python之tkinter:动态演示调用python库的tkinter带你进入GUI世界(计算器简单功能)
- Python:利用python编程实现三维图像绘制展示(六面体旋转、三维球柱状体、下雪场景等)
- Python:利用python语言绘制多个子图经典案例、代码实现之详细攻略
- Python的IDE:基于Eclipse/MyEclipse软件的PyDev插件配置python的开发环境(不同python项目加载不同版本的python)—从而实现Python编程图文教程之详细攻略
- Python语言学习:利用python语言实现调用内部命令(python调用Shell脚本)—命令提示符cmd的几种方法
- 【Python成长之路】python 基础篇 -- 装饰器【华为云分享】
- Python实现哈里斯鹰优化算法(HHO)优化卷积神经网络回归模型(CNN回归算法)项目实战
- Python实现GWO智能灰狼优化算法优化卷积神经网络分类模型(CNN分类算法)项目实战
- Python实现GWO智能灰狼优化算法优化BP神经网络回归模型(BP神经网络回归算法)项目实战
- Python实现GWO智能灰狼优化算法优化BP神经网络分类模型(BP神经网络分类算法)项目实战
- Python实现贝叶斯优化器(Bayes_opt)优化卷积神经网络回归模型(CNN回归算法)项目实战
- Python实现PSO粒子群优化卷积神经网络CNN分类模型项目实战
- Python实现BP神经网络ANN单隐层回归模型项目实战
- 【项目实战】Python实现循环神经网络RNN-LSTM回归模型项目实战(股票价格预测)
- 【项目实战】Python实现基于RBF神经网络的半导体刻蚀机数据分析
- 【Python实战】 ---- python 实现 CSDN 的定时自动签到
- Python .py 文件打包成 .exe 文件(Windows平台,python 3.x)