iis服务器助手广告广告
返回顶部
首页 > 资讯 > 前端开发 > JavaScript >利用Pytorch进行CNN分析
  • 480
分享到

利用Pytorch进行CNN分析

2024-04-02 19:04:59 480人浏览 安东尼
摘要

这篇文章主要介绍“利用PyTorch进行CNN分析”,在日常操作中,相信很多人在利用Pytorch进行CNN分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”利用Pytorc

这篇文章主要介绍“利用PyTorch进行CNN分析”,在日常操作中,相信很多人在利用Pytorch进行CNN分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”利用Pytorch进行CNN分析”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

工具

开源深度学习库: PyTorch

数据集: MNIST

实现

初始要求

利用Pytorch进行CNN分析

首先建立基本的BASE网络,在Pytorch中有如下code:

class Net(nn.Module):     def __init__(self):         super(Net, self).__init__()         self.conv1 = nn.Conv2d(1, 20, kernel_size=(5, 5), stride=(1, 1), padding=0)         self.conv2 = nn.Conv2d(20, 50, kernel_size=(5, 5), stride=(1, 1), padding=0)         self.fc1 = nn.Linear(4*4*50, 500)         self.fc2 = nn.Linear(500, 10)      def forward(self, x):         x = F.max_pool2d(self.conv1(x), 2)         x = F.max_pool2d(self.conv2(x), 2)         x = x.view(-1, 4*4*50)         x = F.relu(self.fc1(x))         x = self.fc2(x)         return F.log_softmax(x)

这部分代码见 base.py 。

问题A:预处理

利用Pytorch进行CNN分析

即要求将MNIST数据集按照规则读取并且tranfORM到适合处理的格式。这里读取的代码沿用了BigDL python  Support的读取方式,无需细说,根据MNIST主页上的数据格式可以很快读出,关键block有读取32位比特的函数:

def _read32(bytestream):     dt = numpy.dtype(numpy.uint32).newbyteorder('>')    # 大端模式读取,***字节在前(MSB first)     return numpy.frombuffer(bytestream.read(4), dtype=dt)[0]

读出后是(N, 1, 28,  28)的tensor,每个像素是0-255的值,首先做一下归一化,将所有值除以255,得到一个0-1的值,然后再Normalize,训练集和测试集的均值方差都已知,直接做即可。由于训练集和测试集的均值方差都是针对归一化后的数据来说的,所以刚开始没做归一化,所以forward输出和grad很离谱,后来才发现是这里出了问题。

这部分代码见 preprocessing.py 。

问题B:BASE模型

利用Pytorch进行CNN分析

将random seed设置为0,在前10000个训练样本上学习参数,***看20个epochs之后的测试集错误率。***结果为:

Test set: Average loss: 0.0014, Accuracy: 9732/10000 (97.3%)

可以看到,BASE模型准确率并不是那么的高。

问题C:Batch Normalization v.s BASE

利用Pytorch进行CNN分析

在前三个block的卷积层之后加上Batch Normalization层,简单修改网络结构如下即可:

class Net(nn.Module):     def __init__(self):         super(Net, self).__init__()         self.conv1 = nn.Conv2d(1, 20, kernel_size=(5, 5), stride=(1, 1), padding=0)         self.conv2 = nn.Conv2d(20, 50, kernel_size=(5, 5), stride=(1, 1), padding=0)         self.fc1 = nn.Linear(4*4*50, 500)         self.fc2 = nn.Linear(500, 10)         self.bn1 = nn.BatchNorm2d(20)         self.bn2 = nn.BatchNorm2d(50)         self.bn3 = nn.BatchNorm1d(500)      def forward(self, x):         x = self.conv1(x)         x = F.max_pool2d(self.bn1(x), 2)         x = self.conv2(x)         x = F.max_pool2d(self.bn2(x), 2)         x = x.view(-1, 4*4*50)         x = self.fc1(x)         x = F.relu(self.bn3(x))         x = self.fc2(x)         return F.log_softmax(x)

同样的参数run一下,得出加了BN的结果为:

Test set: Average loss: 0.0009, Accuracy: 9817/10000 (98.2%)

由此可见,有明显的效果提升。

关于Batch Normalization的更多资料参见[2],[5]。

问题D: Dropout Layer

利用Pytorch进行CNN分析

在***一层即 fc2 层后加一个 Dropout(p=0.5) 后,在BASE和BN上的结果分别为:

BASE:Test set: Average loss: 0.0011, Accuracy: 9769/10000 (97.7%) BN:  Test set: Average loss: 0.0014, Accuracy: 9789/10000 (97.9%)

观察得知,dropout能够对BASE模型起到一定提升作用,但是对BN模型却效果不明显反而降低了。

原因可能在于,BN模型中本身即包含了正则化的效果,再加一层Dropout显得没有必要反而可能影响结果。

问题E:SK model

SK model: Stacking two 3x3 conv. layers to replace 5x5 conv. layer

利用Pytorch进行CNN分析

利用Pytorch进行CNN分析

如此一番改动后,搭建的SK模型如下:

class Net(nn.Module):     def __init__(self):         super(Net, self).__init__()         self.conv1_1 = nn.Conv2d(1, 20, kernel_size=(3, 3), stride=(1, 1), padding=0)         self.conv1_2 = nn.Conv2d(20, 20, kernel_size=(3, 3), stride=(1, 1), padding=0)         self.conv2 = nn.Conv2d(20, 50, kernel_size=(3, 3), stride=(1, 1), padding=0)         self.fc1 = nn.Linear(5*5*50, 500)         self.fc2 = nn.Linear(500, 10)         self.bn1_1 = nn.BatchNorm2d(20)         self.bn1_2 = nn.BatchNorm2d(20)         self.bn2 = nn.BatchNorm2d(50)         self.bn3 = nn.BatchNorm1d(500)         self.drop = nn.Dropout(p=0.5)      def forward(self, x):         x = F.relu(self.bn1_1(self.conv1_1(x)))         x = F.relu(self.bn1_2(self.conv1_2(x)))         x = F.max_pool2d(x, 2)         x = self.conv2(x)         x = F.max_pool2d(self.bn2(x), 2)         x = x.view(-1, 5*5*50)         x = self.fc1(x)         x = F.relu(self.bn3(x))         x = self.fc2(x)         return F.log_softmax(x)

在20个epoch后,结果如下,

SK: Test set: Average loss: 0.0008, Accuracy: 9848/10000 (98.5%)

测试集准确率得到了少许的提高。

这里利用2个3x3的卷积核来代替大的5x5卷积核,参数个数由5x5=25变为了2x3x3=18。实践表明,这样使得计算更快了,并且小的卷积层之间的ReLU也很有帮助。

VGG中就使用了这种方法。

问题F:Change Number of channels

利用Pytorch进行CNN分析

通过将特征图大小乘上一个倍数,再通过shell程序执行,得到如下结果:

SK0.2:  97.7% SK0.5:  98.2% SK1:    98.5% SK1.5:  98.6% SK2:    98.5%  (max 98.7%)

在特征图分别为4,10, 30,  40时,最终的准确度基本是往上提升的。这在一定程度上说明,在没有达到过拟合前,增大特征图的个数,即相当于提取了更多的特征,提取特征数的增加有助于精度的提高。

这部分代码见 SK_s.py 和 runSK.sh 。

问题G:Use different training set sizes

利用Pytorch进行CNN分析

同样通过脚本运行,增加参数

parser.add_argument('--usedatasize', type=int, default=60000, metavar='SZ',                     help='use how many training data to train network')

表示使用的数据大小,从前往后取 usebatchsize 个数据。

这部分程序见 SK_s.py 和 runTrainingSize.sh 。

运行的结果如下:

500:   84.2% 1000:  92.0% 2000:  94.3% 5000:  95.5% 10000: 96.6% 20000: 98.4% 60000: 99.1%

由此可以明显地看出,数据越多,结果的精度越大。

太少的数据无法准确反映数据的整体分布情况,而且容易过拟合,数据多到一定程度效果也会不明显,不过,大多数时候我们总还是嫌数据太少,而且更多的数据获取起来也有一定难度。

问题H:Use different training sets

利用Pytorch进行CNN分析

采用脚本完成,这部分程序见 SK_0.2.py 和 diffTrainingSets.sh 。

运行结果如下:

 0-10000: 98.0% 10000-20000: 97.8% 20000-30000: 97.8% 30000-40000: 97.4% 40000-50000: 97.5% 50000-60000: 97.7%

由此可见,采用不同的训练样本集合训练出来的网络有一定的差异,虽不是很大,但是毕竟显示出了不稳定的结果。

问题I:Random Seed’s effects

利用Pytorch进行CNN分析

采用 runSeed.sh 脚本完成,用到了全部60000个训练集。

运行的结果如下:

Seed      0:  98.9% Seed      1:  99.0% Seed     12:  99.1% Seed    123:  99.0% Seed   1234:  99.1% Seed  12345:  99.0% Seed 123456:  98.9%

事实上在用上整个训练集的时候,随机数生成器的种子设置对于***结果的影响不大。

问题J:ReLU or Sigmoid?

利用Pytorch进行CNN分析

将ReLU全部换成Sigmoid后,用全部60000个训练集训练,有对比结果如下:

ReLU SK_0.2:  99.0% igmoid SK_0.2:  98.6%

由此可以看出,在训练CNN时,使用ReLU激活单元比Sigmoid激活单元要更好一些。原因可能在于二者机制的差别,sigmoid在神经元输入值较大或者较小时,输出值会近乎0或者1,这使得许多地方的梯度几乎为0,权重几乎得不到更新。而ReLU虽然增加了计算的负担,但是它能够显著加速收敛过程,并且也不会有梯度饱和问题。

到此,关于“利用Pytorch进行CNN分析”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

--结束END--

本文标题: 利用Pytorch进行CNN分析

本文链接: https://www.lsjlt.com/news/85985.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 利用Pytorch进行CNN分析
    这篇文章主要介绍“利用Pytorch进行CNN分析”,在日常操作中,相信很多人在利用Pytorch进行CNN分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”利用Pytorc...
    99+
    2024-04-02
  • Python利用CNN实现对时序数据进行分类
    目录一、数据集介绍二、数据预处理2.1 获取原始数据2.2 获取原始标签2.3 数据分割2.4 整合数据和标签2.5 保存三、数据训练3.1 读取数据并进行处理3.2 构建数据结构3...
    99+
    2023-02-22
    Python CNN时序数据分类 Python CNN数据分类 Python CNN
  • 利用Python进行数据分析_Panda
    申明:本系列文章是自己在学习《利用Python进行数据分析》这本书的过程中,为了方便后期自己巩固知识而整理。 import pandas as pd import numpy as np file = 'D:\example.xls'...
    99+
    2023-01-30
    数据 Python _Panda
  • 怎么利用spark进行数据分析
    要利用Spark进行数据分析,首先需要安装和配置Spark环境,并了解Spark的基本概念和API。然后可以按照以下步骤进行数据分析...
    99+
    2024-04-02
  • 如何利用spark进行数据分析
    使用Spark进行数据分析可以遵循以下步骤: 准备数据:将数据加载到Spark中,可以使用Spark的DataFrame API...
    99+
    2024-04-02
  • 怎么利用python进行数值分析
    小编给大家分享一下怎么利用python进行数值分析,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!一、准备噪声是在拟合过程中常用的干扰手段,常用的噪声:统一分布 U(a,b)f ( x ) = { 1 i f a ≤ x &...
    99+
    2023-06-15
  • 怎么利用Python进行客户分群分析
    这篇文章主要讲解了“怎么利用Python进行客户分群分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么利用Python进行客户分群分析”吧!导入数据和python库import ...
    99+
    2023-07-05
  • 如何利用Google Analytics进行数据分析
    利用Google Analytics进行数据分析涉及以下几个关键步骤:1、设置跟踪代码,2、定义目标和转化,3、监测流量来源,4、分析用户行为,5、创建自定义报告,6、设置事件跟踪。在开始使用Google Analytics之前,你需要在网...
    99+
    2023-10-29
    数据 Google Analytics
  • JavaScript如何利用performance.timing进行性能分析
    小编给大家分享一下JavaScript如何利用performance.timing进行性能分析,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!performance.timing:利用performance.timing进行...
    99+
    2023-06-03
  • 如何用PyTorch进行语义分割
    本篇内容主要讲解“如何用PyTorch进行语义分割”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何用PyTorch进行语义分割”吧!预设置在开始训练之前,得首先设置一下库、数据集等。库准备pi...
    99+
    2023-06-15
  • 教你如何利用python进行数值分析
    目录一、准备二、三次样条插值三、最小二乘拟合四、拉格朗日乘子法一、准备 噪声是在拟合过程中常用的干扰手段,常用的噪声: 1.统一分布 U(a,b) f ( x ) = { 1 i f...
    99+
    2024-04-02
  • 详解如何利用Python进行客户分群分析
    目录导入数据和python库分离新老客户按客户ID排序,然后是日期定义一些函数创建群组转换为群组百分比可视化每个电子商务数据分析师必须掌握的一项数据聚类技能 如果你是一名在电子商务公...
    99+
    2023-02-24
    Python实现客户分群分析 Python客户分群分析 Python客户分析
  • python中怎么利用PyTorch进行回归运算
    本篇内容介绍了“python中怎么利用PyTorch进行回归运算”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!PyTorch中的重要基础函数...
    99+
    2023-06-30
  • PyTorch中如何进行模型的解释性分析
    PyTorch提供了多种方法来进行模型的解释性分析,以下是一些常用的方法: 特征重要性分析:可以使用SHAP(SHapley A...
    99+
    2024-03-05
    PyTorch
  • Python怎么用CNN实现对时序数据进行分类
    这篇“Python怎么用CNN实现对时序数据进行分类”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Python怎么用CNN实...
    99+
    2023-07-05
  • 如何利用Angr进行简单CTF逆向分析
    如何利用Angr进行简单CTF逆向分析,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。一、符号执行概括简单的来说,符号执行就是在运行程序时,用符号来替代真实值。符号执行相较于...
    99+
    2023-06-17
  • pytorch如何利用ResNet18进行手写数字识别
    目录利用ResNet18进行手写数字识别先写resnet18.py再写绘图utils.py最后是主函数mnist_train.py总结利用ResNet18进行手写数字识别 先写res...
    99+
    2023-02-02
    pytorch ResNet18 ResNet18手写数字识别 pytorch手写数字识别
  • 利用python数据分析处理进行炒股实战行情
    目录数据内容:1、数据采集我们现在要取一批特定股票的日线行情库名:stock 表名:stock_all2、数据预处理以机器学习的视角来看,数据预处理主要包括应用有监督学习的算法对个股...
    99+
    2024-04-02
  • PyTorch中怎么进行模型评估和性能分析
    在PyTorch中,可以使用torch.utils.data.DataLoader加载测试数据集,并调用模型的eval()方法进入评...
    99+
    2024-03-05
    PyTorch
  • 利用Python从网页抓取数据并进行分析
    在当今信息爆炸的时代,网络成为人们获取信息的主要途径之一,而数据挖掘则成为了解析这些海量数据的重要工具。Python作为一种功能强大且易于学习的编程语言,被广泛应用于网络爬虫和数据挖掘...
    99+
    2024-02-25
    python 数据挖掘 网络爬虫
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作