| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 人工智能 -> 深度学习为什么选择Pytorch?史上最详细Pytorch入门教程 -> 正文阅读 |
|
[人工智能]深度学习为什么选择Pytorch?史上最详细Pytorch入门教程 |
目录 前言工欲善其事,必先利其器。近几年深度学习飞速发展让人瞠目结舌,但它的崛起背后离不开最大的功臣——深度学习框架。如果没有这些深度学习框架,深度学习绝对不会像现在一样“平民化”,很多人可能陷入在茫茫的数学深渊中。有了便捷实用的深度学习框架,我们才可以把所有精力花在如何设计模型本身上,而不用再去关注模型优化的细节,所有的事情均由框架来负责,极大降低了深度学习使用的门槛。这也是为什么现在只要经过短期有效训练的开发工程师也可以在使用深度学习模型身上得心应手的主要原因。 一、 Pytorch介绍1.常见的深度学习框架深度学习框架的发展也经历了超过10年的时间,从早期比较流行的theano到现在比较火爆的框架如Pytorch, Tensorflow,经历了几个阶段的发展和迭代。 ?图中展示了几个比较有代表性的深度学习框架,是不同时代的产物。比如图里的Caffe来源于伯克利的一位博士生,框架本身效率高,但需要编写比较繁琐的配置文件。在配置文件中会设置网络的层次、每一层的参数等所有细节,目前在工业界仍然是一个比较受欢迎的深度学习框架。另外,Keras的使用也比较广泛。它一开始是建立在Tensorflow之上的,并封装了很多的模块,让使用者可以更低门槛地去设计深度学习模型,目前也有大量的使用者。但缺点是,由于做了进一步的封装,如果想做一些改动,灵活性上相比Tensorflow要差一些。 2.Pytorch框架的崛起本节,我们主要比较TensorFlow与Pytorch两个框架的发展历史以及趋势,分别从搜索热度、学术界的欢迎度等角度来剖析。之所以选择这两个框架,一方面的原因在于确实这俩是目前最火爆的框架,另外一方面的原因是也比较适合刚步入AI领域的人士去接触和学习。 图里展示的是Google搜索引擎上的搜索热度,代表有多少人去搜索这两个框架。从图中可以很清楚地看到,17年的时候TensorFlow仍然占据着完全主导性的地位,但随着时间的推移,Pytorch的增长越来越快,到了20年初基本上逼近了Tensorflow的热度,而且这种增长趋势仍在持续。 ? 以上两幅图表示的是Pytorch和TensorFlow在学术界的使用情况,分别算出了每一年顶会中有多少篇文章的实验用这两个工具来做的。很容易发现,在学术界里Pytorch的优势更加明显,显示出强势的增长。那为什么会出现这种趋势呢? 主要还是Pytorch用起来简单,而且效率也不差。对于之前没有接触过深度学习框架的人,Pytorch无疑是首选,特别适合入门。 3.Pytorch与Tensorflow多方位比较?以上图中给出了两个框架之间具体的差异,其中最重要的差别在于Pytorch采用了命令式编程,TensorFlow则采用了符号式编程,实际上这是两种完全不同的编程方式。命令式编程其实就是我们最熟悉的编程方式,比如使用Python, Java等等。然而,符号式编程就不一样了,首选需要构建计算图,然后再把数据灌到图里做计算。 ? 二、Tensors1.Tensor的创建首先需要理解Tensor这个关键词,这是Pytorch中最基础的数据结构,类似于Numpy库中的array, matrix一样。但在Pytorch我们把这些统一定义为Tensor。为什么要起这个名字呢? 这一点其实之前有讲过。数据的表现形式通常为标量(scalar)、向量(vector)、矩阵(matrix)、张量(Tensor)。 其中标量可以看作是0维的张量、向量看作是1维的张量、矩阵看作是2维的张量,依次类推。所以,最终我们可以把Tensor作为这些数据结构的统称,这也是为什么像TensorFlow这种框架里包含Tensor关键词的主要原因。 Tensor库的导入 为了使用Pytorch的数据结构与功能,首先需要导入相应的库。这类似于当使用Numpy的时候导入numpy库一样。对于Pytorch,我们可以导入torch库。
从已有数据直接构建Tensor 第一步是构建Tensor类型的数据,其中一个方法是直接利用已有的数据来初始化Tensor,如下所示:
把Numpy数据转换成Tensor类型 如果数据已经表示为Numpy类型,我们也可以直接把它转换为Tensor类型的数据,这种操作在实际项目中非常实用。
直接利用Tensor库来创建Tensor数据 另外一种方式是直接使用Tensor所提供的方法来构造Tensor数据,这类似于我们调用numpy。zeors()函数来创建numpy型数据一样。请看如下几行代码:
Tensor的属性(attributes) 构建好Tensor之后,我们可以查看它的一些属性如大小、类型、以及存放在cpu还是在gpu等信息。以上属性依次通过shape, dtype, device关键词来获取。?
2.Tensor的操作Tensor也像Numpy array支持各种各样的运算操作,比如矩阵乘法、加法、采样等等,而且这些运算均可以在GPU上进行。如果想把 Tensor在GPU做计算,需要把它先挪到GPU内存中,通过以下几行代码就可以实现:
Tensor的索引 对于Tensor, 我们可以很方便的提取它的某一行、某一列、或者多行、多列,使用方法跟numpy几乎一模一样。
多个Tensor的拼接 很多时候,我们需要把多个Tensor做拼接,并转换为更大的Tensor。 这种操作可以通过自带的torch.cat()来完成,具体以哪个方向做拼接由dim参数来设定。
Tensor的乘法 给定两个Tensor也可以方便地完成乘法运算。这里需要注意的一点是,一种乘法运算可以是我们所熟知的正常的矩阵乘法运算,另外一种乘法运算是按照每一个位置的乘法运算。
3.Tensor与Numpy从Tensor到Numpy 在CPU上,Tensor和Numpy变量可以共享一个内存空间,改变其中一个会自动改变另外一个。从Tensor到numpy类型的转化通过函数numpy()即可以实现。
从Numpy到Tensor的转换 另一个方向的转换也极其简单,可通过from_numpy()函数来完成。这种情况下两个变量会共享一个内存,改变其中一个也会改变另外一个变量,这一点需要留意一下。
三、Autograd的讲解1.模型中的前向传播与反向传播之前已经介绍过神经网络中的前向传播和反向传播的概念,在这做一个简单的回顾。对于神经网络的优化,一般分为两个步骤:第一步为前向传播,也就是给定训练数据,通过前向传播计算出模型中每个节点的输出;第二步则为反向传播,通过这一步计算出每一个参数的梯度,最后做参数的更新。实际上,Pytorch中的autograd模块可以完成这些事情。 下面,来介绍一个具体的例子。首先,导入已经训练好的restnet模型,同时也构建一个随机样本。这个样本为一张64*64的图片且每一个像素由RGB来表示,对应的标签为一个整数。
2.利用autograd计算梯度对于autograd再看一个例子,用来加深对它的理解。假如有两个Tensor分别为a和b, 同时设置requires_grad=True, 这样的结果就是autograd会保存对于相应变量的操作。
四、 构建神经网络模型1.数据的构造搭建的过程主要分为以下几步:
数据的构造 至于数据这块,为了简单期间,先用一个模拟的数据来代替,而且这并不影响我们对后续环节的理解。
2.模型的构造对于模型这部分,需要设计的是前向传播部分(forward),因为这部分其实决定了整个模型的细节,比如一个数据进入模型之后,如何一步步转换成最终的输出。转换细节实际上就是模型的细节。 在构建模型时,我们通常会创建一个新的类(class),并起一个合适的名字给到神经网络,之后在初始化阶段定义模型中所使用的参数和部件,接着在forward()函数中设计输入到输出中所经历的所有的过程。
3.优化器选择和配置设计好了模型之后,剩下的工作就是设计loss和配置优化器。在模型中我们定义了forward()函数内容,通过这个函数就可以得到对于输入的预测。有了预测就可以跟真实值做比较来计算损失了。所以首先要定义损失函数的形态,是使用MSE还是交叉熵损失,还是Hinge Loss? 当然,这些取决于问题本身。在上述例子中,由于问题是二分类问题,我们决定选择交叉熵损失(entropy loss)。
4.主函数完成了所有上述步骤之后,剩下的就是主函数部分了。在这里需要定义要循环多少次(epoch),如何保存中间结果,如何输出准确率等内容。
参考: 贪心学院nlp |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 | -2024/12/22 10:56:58- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |