赞
踩
Pytorch实现CNN
用 python 的 Pytorch 模块实现卷积神经网络。网络结构为一个输入层、两个卷积层、一个全连接层、一个输出层。
通过学习的卷积神经网络(CNN)基本原理(网络结构,损失函数,参数学习),使用numpy和Pytorch模块实现卷积神经网络,进一步加深对卷积神经网络的理解。掌握卷积神经网络原理和方法。
设置batch_size为100,迭代轮数为10轮,学习率为1e-4,dropout留下比例为0.7,即0.3的比例被抛弃,设置GPU/CPU训练。
使用torchvision下载图片数据集,并将其转化为张量,进行归一化处理,划分训练集和测试集。
使用Net类继承torch.nn.Module框架,使用两个卷积块,每一个卷积块由一个卷积核,一个ReLU激活函数,一个池化层组成。而后加入展平层,连接两个全连接层,最后softmax分类。
具体网络结构如下:
使用交叉熵损失函数和adam优化器
对每一次迭代,计算loss与acc,每一个epoch完成后,计算测试集上的loss与acc,并且计算总的评价loss与acc。
将第二个卷积块去掉,只用一层卷积一层池化,代码和网络结构图如下:
将两层卷积核的大小均改为3x3,代码和网络结构图如下:
使用LetNet网络,自定义展平操作,并将图像大小重定型,代码和网络结构图如下:
将学习率由1e-4次方改为1e-5次方,epoch由10改为20。
将激活函数由ReLU函数改为Softmax函数,代码和网络结构如下:
本次实验通过Pytorch实现了卷积神经网络的搭建与训练过程,通过改变神经网络的超参数,比较前后模型学习能力,与理论知识相结合,有很大的收获。根据实验结果对比分析可以看出,随着epoch的增大,模型的拟合能力越来越强,但是,随着epoch增加,模型也会发生过拟合,Sigmoid激活函数在卷积神经网络中的效果不如ReLU函数,随着卷积层数的加深,模型的效果也越来越好,但是也会不可避免会发生梯度消失或者梯度爆炸等问题。同时,我也得到了如下心得体会:
1) 卷积网络入门其实没有想象的那么难,但是越往高处走越来越需要我们去细心琢磨。
2) 在卷积神经网络中,有必要去深入了解一些经典的卷积神经网络。由浅入深,例如:LeNet、AlexNet、VGG16、Inception网络、ResNet网络等等。
3) 在了解这些网络的时候应该多考虑别人为什么要这么做,这样做又什么好处。例如VGG16中又大量的33卷积核,加入较多的33卷积核在感受野不变的情况下能够缩小模型参数量。
4) 在学习卷积神经网络的过程中,应该较多的做好一些实践,这样不仅仅能够让你更加深入的去理解网络的构成流程而且能让你产生更大的兴趣去学习去钻研。
5) 在学习卷积网络的过程中,应该适当的去修改一些经典网络,看看在修改过后有什么的不同,在从这些不同的地方吸取一些教训,然后在以后碰到类似的问题的时候能够有一些经验。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。