pytorch是啥?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了pytorch是啥?相关的知识,希望对你有一定的参考价值。

PyTorch是一个开源的Python机器学习库,基于Torch,用于自然语言处理等应用程序。

由Facebook人工智能研究院(FAIR)基于Torch推出了PyTorch。它是一个基于Python的可续计算包,提供两个高级功能:具有强大的GPU加速的张量计算(如NumPy)。包含自动求导系统的深度神经网络。

PyTorch的发展:

PyTorch的前身是Torch,其底层和Torch框架一样,但是使用Python重新写了很多内容,不仅更加灵活,支持动态图,而且提供了Python接口。它是由Torch7团队开发,是一个以Python优先的深度学习框架,不仅能够实现强大的GPU加速,同时还支持动态神经网络。

PyTorch既可以看作加入了GPU支持的numpy,同时也可以看成一个拥有自动求导功能的强大的深度神经网络。除了Facebook外,它已经被Twitter、CMU和Salesforce等机构采用。

参考技术A PyTorch是一个开源的Python机器学习库,基于Torch,用于自然语言处理等应用程序。
PyTorch的前身是Torch,其底层和Torch框架一样,但是使用Python重新写了很多内容,不仅更加灵活,支持动态图,而且提供了Python接口。它是由Torch7团队开发,是一个以Python优先的深度学习框架,不仅能够实现强大的GPU加速,同时还支持动态神经网络。
PyTorch既可以看作加入了GPU支持的numpy,同时也可以看成一个拥有自动求导功能的强大的深度神经网络。除了Facebook外,它已经被Twitter、CMU和Salesforce等机构采用。

在pytorch中,后向方法的第一个参数(梯度)是啥?

【中文标题】在pytorch中,后向方法的第一个参数(梯度)是啥?【英文标题】:What is the first parameter (gradients) of the backward method, in pytorch?在pytorch中,后向方法的第一个参数(梯度)是什么? 【发布时间】:2018-01-31 21:58:18 【问题描述】:

我们从 pytorch 文档中获得了以下代码:

x = torch.randn(3)
x = Variable(x, requires_grad=True)

y = x * 2
while y.data.norm() < 1000:
    y = y * 2

gradients = torch.FloatTensor([0.1, 1.0, 0.0001])
y.backward(gradients)

我们传递给后向方法的梯度参数到底是什么?我们根据什么来初始化它?

【问题讨论】:

Pytorch, what are the gradient arguments的可能重复 【参考方案1】:

要完全回答您的问题,需要更长的解释,围绕Backprop 或更根本的chain rule 工作原理的细节展开。

简短的编程答案是Variable 的反向函数计算附加到Variable 的计算图中所有变量的梯度。 (澄清一下:如果你有a = b + c,那么计算图(递归地)首先指向b,然后指向c,然后指向它们的计算方式等)并将这些梯度累积存储(总和)这些变量的.grad 属性。然后,当您调用 opt.step()(即优化器的一个步骤)时,它会将梯度的一部分添加到这些变量的值中。

也就是说,从概念上看,有两个答案:如果您想训练机器学习模型,您通常希望获得关于某个损失函数的梯度。在这种情况下,计算的梯度将使得在应用阶跃函数时整体损失(标量值)将减少。在这种特殊情况下,我们希望将梯度计算为特定值,即单位长度步长(这样学习率将计算出我们想要的梯度分数)。这意味着如果你有一个损失函数,并且你调用loss.backward(),这将与loss.backward(torch.FloatTensor([1.])) 计算相同。

虽然这是 DNN 中反向传播的常见用例,但它只是函数一般微分的一个特例。更一般地,符号微分包(在这种情况下为 autograd,作为 pytorch 的一部分)可用于计算计算图早期部分的梯度,相对于您在任何子图的根处的 any 梯度选择。这是关键字参数gradient 派上用场的时候,因为您可以在那里提供这种“根级”渐变,即使对于非标量函数也是如此!

为了说明,这里有一个小例子:

a = nn.Parameter(torch.FloatTensor([[1, 1], [2, 2]]))
b = nn.Parameter(torch.FloatTensor([[1, 2], [1, 2]]))
c = torch.sum(a - b)
c.backward(None)  # could be c.backward(torch.FloatTensor([1.])) for the same result
print(a.grad, b.grad) 

打印:

Variable containing:
 1  1
 1  1
[torch.FloatTensor of size 2x2]
 Variable containing:
-1 -1
-1 -1
[torch.FloatTensor of size 2x2]

虽然

a = nn.Parameter(torch.FloatTensor([[1, 1], [2, 2]]))
b = nn.Parameter(torch.FloatTensor([[1, 2], [1, 2]]))
c = torch.sum(a - b)
c.backward(torch.FloatTensor([[1, 2], [3, 4]]))
print(a.grad, b.grad)

打印:

Variable containing:
 1  2
 3  4
[torch.FloatTensor of size 2x2]
 Variable containing:
-1 -2
-3 -4
[torch.FloatTensor of size 2x2]

a = nn.Parameter(torch.FloatTensor([[0, 0], [2, 2]]))
b = nn.Parameter(torch.FloatTensor([[1, 2], [1, 2]]))
c = torch.matmul(a, b)
c.backward(torch.FloatTensor([[1, 1], [1, 1]]))  # we compute w.r.t. a non-scalar variable, so the gradient supplied cannot be scalar, either!
print(a.grad, b.grad)

打印

Variable containing:
 3  3
 3  3
[torch.FloatTensor of size 2x2]
 Variable containing:
 2  2
 2  2
[torch.FloatTensor of size 2x2]

a = nn.Parameter(torch.FloatTensor([[0, 0], [2, 2]]))
b = nn.Parameter(torch.FloatTensor([[1, 2], [1, 2]]))
c = torch.matmul(a, b)
c.backward(torch.FloatTensor([[1, 2], [3, 4]]))  # we compute w.r.t. a non-scalar variable, so the gradient supplied cannot be scalar, either!
print(a.grad, b.grad)

打印:

Variable containing:
  5   5
 11  11
[torch.FloatTensor of size 2x2]
 Variable containing:
 6  8
 6  8
[torch.FloatTensor of size 2x2]

【讨论】:

以上是关于pytorch是啥?的主要内容,如果未能解决你的问题,请参考以下文章

PyTorch 中的 Torch 脚本是啥?

在 PyTorch 中,是啥让张量具有非连续内存?

在 PyTorch 中保存训练模型的最佳方法是啥? [关闭]

-1 在 pytorch 视图中是啥意思?

在pytorch中,后向方法的第一个参数(梯度)是啥?

在 PyTorch 中加载迁移学习模型进行推理的正确方法是啥?