强大的PyTorch:10分钟让你了解深度学习领域新流行的框架

更多深度文章,请关注:https://yq.aliyun.com/cloud


PyTorch由于使用了强大的GPU加速的Tensor计算(类似numpy)和基于tape的autograd系统的深度神经网络。这使得今年一月份被开源的PyTorch成为了深度学习领域新流行框架,许多新的论文在发表过程中都加入了大多数人不理解的PyTorch代码。这篇文章我们就来讲述一下我对PyTorch代码的理解,希望能帮助你阅读PyTorch代码。整个过程是基于贾斯汀·约翰逊的伟大教程。如果你想了解更多或者有超过10分钟的时间,建议你去读下整篇代码。

PyTorch由4个主要包装组成:

  1. Torch:类似于Numpy的通用数组库,可以在将张量类型转换为(torch.cuda.TensorFloat)并在GPU上进行计算。
  2. torch.autograd:用于构建计算图形并自动获取渐变的包
  3. torch.nn:具有共同层和成本函数的神经网络库
  4. torch.optim:具有通用优化算法(如SGD,Adam等)的优化包

1.导入工具

你可以这样导入PyTorch:

 
 
import torch # arrays on GPU
import torch.autograd as autograd #build a computational graph
import torch.nn as nn # neural net library
import torch.nn.functional as F # most non-linearities are here
import torch.optim as optim # optimization package

2.torch数组取代了numpy ndarray - >在GPU支持下提供线性代数

第一个特色,PyTorch提供了一个像Numpy数组一样的多维数组,当数据类型被转换为(torch.cuda.TensorFloat)时,可以在GPU上进行处理。这个数组和它的关联函数是一般的科学计算工具。

从下面的代码中,我们可以发现,PyTorch提供的这个包的功能可以将我们常用的二维数组变成GPU可以处理的三维数组。这极大的提高了GPU的利用效率,提升了计算速度。

大家可以自己比较 Torch和numpy ,从而发现他们的优缺点。

# 2 matrices of size 2x3 into a 3d tensor 2x2x3
d=[[[1., 2.,3.],[4.,5.,6.]],[[7.,8.,9.],[11.,12.,13.]]]
d=torch.Tensor(d) # array from python list
print "shape of the tensor:",d.size()
# the first index is the depth
z=d[0]+d[1]
print "adding up the two matrices of the 3d tensor:",z
shape of the tensor: torch.Size([2, 2, 3])
adding up the two matrices of the 3d tensor: 
  8  10  12
 15  17  19
[torch.FloatTensor of size 2x3]
# a heavily used operation is reshaping of tensors using .view()
print d.view(2,-1) #-1 makes torch infer the second dim
  1   2   3   4   5   6
  7   8   9  11  12  13
[torch.FloatTensor of size 2x6]

3.torch.autograd可以生成一个计算图 - >自动计算梯度

第二个特色是autograd包,其提供了定义计算图的能力,以便我们可以自动计算渐变梯度。在计算图中,一个节点是一个数组,边(edge)是on数组的一个操作。要做一个计算图,我们需要在(torch.aurograd.Variable())函数中通过包装数组来创建一个节点。那么我们在这个节点上所做的所有操作都将被定义为边,它们将是计算图中新的节点。图中的每个节点都有一个(node.data)属性,它是一个多维数组和一个(node.grad)属性,这是相对于一些标量值的渐变(node.grad也是一个.Variable()) 。在定义计算图之后,我们可以使用单个命令(loss.backward())来计算图中所有节点的损耗梯度。

  • 使用torch.autograd.Variable()将张量转换为计算图中的节点。
    • 使用x.data访问其值。
    • 使用x.grad访问其渐变。
  • .Variable()上执行操作,绘制图形的边缘。

# d is a tensor not a node, to create a node based on it:
x= autograd.Variable(d, requires_grad=True)
print "the node's data is the tensor:", x.data.size()
print "the node's gradient is empty at creation:", x.grad # the grad is empty right now
the node's data is the tensor: torch.Size([2, 2, 3])
the node's gradient is empty at creation: None
# do operation on the node to make a computational graph
y= x+1
z=x+y
s=z.sum()
print s.creator
<torch.autograd._functions.reduce.Sum object at 0x7f1e59988790>
# calculate gradients
s.backward()
print "the variable now has gradients:",x.grad
the variable now has gradients: Variable containing:
(0 ,.,.) = 
  2  2  2
  2  2  2
(1 ,.,.) = 
  2  2  2
  2  2  2
[torch.FloatTensor of size 2x2x3]

4.torch.nn包含各种NN层(张量行的线性映射)+(非线性)-->

其作用是有助于构建神经网络计算图,而无需手动操纵张量和参数,减少不必要的麻烦。

第三个特色是高级神经网络库(torch.nn),其抽象出了神经网络层中的所有参数处理,以便于在通过几个命令(例如torch.nn.conv)就很容易地定义NN。这个包也带有流行的损失函数的功能(例如torch.nn.MSEloss)。我们首先定义一个模型容器,例如使用(torch.nn.Sequential)的层序列的模型,然后在序列中列出我们期望的层。这个高级神经网络库也可以处理其他的事情,我们可以使用(model.parameters())访问参数(Variable())

# linear transformation of a 2x5 matrix into a 2x3 matrix
linear_map=nn.Linear(5,3)
print "using randomly initialized params:", linear_map.parameters
using randomly initialized params: <bound method Linear.parameters of Linear (5 -> 3)>
# data has 2 examples with 5 features and 3 target
data=torch.randn(2,5) # training
y=autograd.Variable(torch.randn(2,3)) # target
# make a node
x=autograd.Variable(data, requires_grad=True)
# apply transformation to a node creates a computational graph
a=linear_map(x)
z=F.relu(a)
o=F.softmax(z)
print "output of softmax as a probability distribution:", o.data.view(1,-1)
# loss function
loss_func=nn.MSELoss() #instantiate loss function
L=loss_func(z,y) # calculateMSE loss between output and target
print "Loss:", L
output of softmax as a probability distribution: 
 0.2092  0.1979  0.5929  0.4343  0.3038  0.2619
[torch.FloatTensor of size 1x6]
Loss: Variable containing:
 2.9838
[torch.FloatTensor of size 1]

我们还可以通过子类(torch.nn.Module)定义自定义层,并实现接受(Variable())作为输入的(forward())函数,并产生(Variable())作为输出。我们也可以通过定义一个时间变化的层来做一个动态网络。

  • 定义自定义层时,需要实现2个功能:
    • init_函数必须始终被继承,然后层的所有参数必须在这里定义为类变量(self.x
    • 正向函数是我们通过层传递输入的函数,使用参数对输入进行操作并返回输出。输入需要是一个autograd.Variable(),以便pytorch可以构建图层的计算图。

class Log_reg_classifier(nn.Module):
    def __init__(self, in_size,out_size):
        super(Log_reg_classifier,self).__init__() #always call parent's init 
        self.linear=nn.Linear(in_size, out_size) #layer parameters
    def forward(self,vect):
        return F.log_softmax(self.linear(vect)) # 

5.torch.optim也可以做优化—>

我们使用torch.nn构建一个nn计算图,使用torch.autograd来计算梯度,然后将它们提供给torch.optim来更新网络参数。

第四个特色是与NN库一起工作的优化软件包(torch.optim)。该库包含复杂的优化器,如AdamRMSprop等。我们定义一个优化器并传递网络参数和学习率(opt = torch.optim.Adammodel.parameters(),lr = learning_rate)),然后我们调用(opt.step())对我们的参数进行近一步更新。

optimizer=optim.SGD(linear_map.parameters(),lr=1e-2) # instantiate optimizer with model params + learning rate
# epoch loop: we run following until convergence
optimizer.zero_grad() # make gradients zero
L.backward(retain_variables=True)
optimizer.step()
print L
Variable containing:
 2.9838
[torch.FloatTensor of size 1]

建立神经网络很容易,但是如何协同工作并不容易。这是一个示例显示如何协同工作:


# define model
model = Log_reg_classifier(10,2)
# define loss function
loss_func=nn.MSELoss() 
# define optimizer
optimizer=optim.SGD(model.parameters(),lr=1e-1)
# send data through model in minibatches for 10 epochs
for epoch in range(10):
    for minibatch, target in data:
        model.zero_grad() # pytorch accumulates gradients, making them zero for each minibatch
        #forward pass
        out=model(autograd.Variable(minibatch))
        #backward pass 
        L=loss_func(out,target) #calculate loss
        L.backward() # calculate gradients
        optimizer.step() # make an update step

希望上述的介绍能够帮你更好的阅读PyTorch代码。  

本文由北邮@爱可可-爱生活老师推荐,阿里云云栖社区组织翻译。

文章原标题《Understand PyTorch code in 10 minutes》,

作者: Hamidreza Saghir机器学习研究员 - 多伦多大学博士生 译者:袁虎 审阅:阿福

文章为简译,更为详细的内容,请查看原文






  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: PyTorch是一个基于Python的开源机器学习库,用于构建深度神经网络。它由Facebook的人工智能研究小组开发和维护。PyTorch是一个动态图形框架,允许用户在运行时定义、修改和调试计算图。它还提供了易于使用的API,使得数据加载、优化和模型训练变得简单易行。PyTorch还支持GPU加速,可以快速处理大规模数据集。总之,PyTorch是一个灵活、高效、易用的深度学习框架,适用于各种应用场景。 ### 回答2: PyTorch是一个流行深度学习框架,它由Facebook人工智能研究院开发。它是一个基于Python的开源库,广泛用于构建和训练神经网络。 PyTorch的主要特点之一是动态计算图的支持。与静态计算图的框架相比,PyTorch允许用户在每个迭代步骤中根据需要构建和修改计算图。这样的设计使得PyTorch更加灵活,便于调试和实验。 另一个引人注目的功能是其直观和简洁的API。PyTorch提供了丰富的高级API,使用户能够轻松定义神经网络架构、加载和处理数据、计算损失函数等。通过这些API,用户可以更加专注于模型的设计和优化,而不需要过多关注底层实现细节。 PyTorch还提供了自动求导功能,使得计算梯度变得非常简单。用户只需将需要求导的变量包装成PyTorch的Tensor对象,并使用反向传播算法计算梯度。这种自动求导功能方便了模型的训练和优化,并为研究人员提供了更多的实验自由度。 除了以上特点,PyTorch还有一些其他的优点。例如,它具有扩展性良好的生态系统,包括各种功能强大的库和工具,如torchvision和torchtext。此外,PyTorch还提供了GPU计算支持,充分发挥了深度学习在加速计算方面的优势。 综上所述,PyTorch是一个功能强大且易于使用的深度学习框架。它的灵活性、直观的API和自动求导功能使得模型的设计、开发和优化变得更加高效和便捷。对于研究人员和开发人员来说,PyTorch无疑是一个重要的工具,可以帮助他们推动深度学习领域的进步。 ### 回答3: PyTorch是一个基于Python深度学习框架,是由Facebook AI研发并开源的。它可以广泛应用于各种领域深度学习任务,包括图像识别、自然语言处理、语音识别等。 PyTorch具有较高的灵活性和易用性,因此成为了深度学习领域中的热门选择。它具有动态图的特点,可以实时地创建、修改计算图,使得调试和开发过程更加方便。相比之下,其他一些深度学习框架如TensorFlow则采用静态图,需要先构建完整的计算图,才能进行运算。 PyTorch提供丰富的工具和功能,帮助用户开展深度学习工作。例如,它内置了多种优化算法,如SGD、Adam等,可以简便地进行模型的参数优化。此外,它还提供了各种预训练模型和预处理工具,可以加速深度学习的训练过程。同时,PyTorch还可以与其他常用的Python工具库如NumPy、matplotlib等进行无缝集成,方便用户进行数据处理和结果可视化。 值得一提的是,PyTorch拥有一个庞大的开源社区,用户可以从中获取各种教程、示例代码和优化技巧,并与其他用户进行交流和讨论。这些资源能够帮助手快速上手PyTorch,并解决在使用中遇到的问题。 总的来说,PyTorch是一个强大、灵活且易用的深度学习框架,对于研究人员和开发者来说都是一个理想的选择。它的广泛应用和持续更使得它成为当前深度学习领域的主流框架之一。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值