Pytorch实现CNN

神经网络与深度学习实验报告

一、实验名称

Pytorch实现CNN

二、实验要求

用 python 的 Pytorch 模块实现卷积神经网络。网络结构为一个输入层、两个卷积层、一个全连接层、一个输出层。
在这里插入图片描述

三、实验目的

通过学习的卷积神经网络(CNN)基本原理(网络结构,损失函数,参数学习),使用numpy和Pytorch模块实现卷积神经网络,进一步加深对卷积神经网络的理解。掌握卷积神经网络原理和方法。

四、实验过程

4.1 卷积神经网络

4.1.1 Pytorch环境配置

  1. 终端中输入 nvidia-smi, 查看 CUDA 版本;
  2. 进入Pytorch官网 https://pytorch.org/get-started/locally/找到对应CUDA版本的 Pytorch(ps:一般 来说Pytorch官网会直接提供conda下载指令);
  3. 终端中使用conda创建新环境并下载Pytorch;
  4. 进入Python检查是否安装成功

4.1.2学习参数设置

设置batch_size为100,迭代轮数为10轮,学习率为1e-4,dropout留下比例为0.7,即0.3的比例被抛弃,设置GPU/CPU训练。

在这里插入图片描述

4.1.2数据集加载

使用torchvision下载图片数据集,并将其转化为张量,进行归一化处理,划分训练集和测试集。
在这里插入图片描述

4.1.3 网络构建

使用Net类继承torch.nn.Module框架,使用两个卷积块,每一个卷积块由一个卷积核,一个ReLU激活函数,一个池化层组成。而后加入展平层,连接两个全连接层,最后softmax分类。
在这里插入图片描述

具体网络结构如下:
在这里插入图片描述

4.1.4 损失函数和优化算法

使用交叉熵损失函数和adam优化器
在这里插入图片描述

4.1.4 模型训练和测试

对每一次迭代,计算loss与acc,每一个epoch完成后,计算测试集上的loss与acc,并且计算总的评价loss与acc。
在这里插入图片描述

4.2 更改神经网络拓扑结构、激活规则和学习算法

4.2.1 去掉一层卷积和一层池化

将第二个卷积块去掉,只用一层卷积一层池化,代码和网络结构图如下:
在这里插入图片描述
在这里插入图片描述

4.2.2 改变卷积核的大小

将两层卷积核的大小均改为3x3,代码和网络结构图如下:
在这里插入图片描述
在这里插入图片描述

4.2.3 LetNet网络

使用LetNet网络,自定义展平操作,并将图像大小重定型,代码和网络结构图如下:
在这里插入图片描述
在这里插入图片描述

4.2.5 更改学习率和epoch

将学习率由1e-4次方改为1e-5次方,epoch由10改为20。

4.2.6 更改激活函数

将激活函数由ReLU函数改为Softmax函数,代码和网络结构如下:

在这里插入图片描述

五、实验结果

在这里插入图片描述

六、实验总结

本次实验通过Pytorch实现了卷积神经网络的搭建与训练过程,通过改变神经网络的超参数,比较前后模型学习能力,与理论知识相结合,有很大的收获。根据实验结果对比分析可以看出,随着epoch的增大,模型的拟合能力越来越强,但是,随着epoch增加,模型也会发生过拟合,Sigmoid激活函数在卷积神经网络中的效果不如ReLU函数,随着卷积层数的加深,模型的效果也越来越好,但是也会不可避免会发生梯度消失或者梯度爆炸等问题。同时,我也得到了如下心得体会:
1) 卷积网络入门其实没有想象的那么难,但是越往高处走越来越需要我们去细心琢磨。
2) 在卷积神经网络中,有必要去深入了解一些经典的卷积神经网络。由浅入深,例如:LeNet、AlexNet、VGG16、Inception网络、ResNet网络等等。
3) 在了解这些网络的时候应该多考虑别人为什么要这么做,这样做又什么好处。例如VGG16中又大量的33卷积核,加入较多的33卷积核在感受野不变的情况下能够缩小模型参数量。
4) 在学习卷积神经网络的过程中,应该较多的做好一些实践,这样不仅仅能够让你更加深入的去理解网络的构成流程而且能让你产生更大的兴趣去学习去钻研。
5) 在学习卷积网络的过程中,应该适当的去修改一些经典网络,看看在修改过后有什么的不同,在从这些不同的地方吸取一些教训,然后在以后碰到类似的问题的时候能够有一些经验。

猜你喜欢

转载自blog.csdn.net/weixin_55085530/article/details/127813927