pytorch自动微分的几个例子

        昨天微信‘机器之心’发布了开源软件pytorch出场的重磅消息。看内容感觉动态计算图的思路比较新颖。在初步体验其自动微分操作之后,发觉这个算法包确实是将计算图的符号占位变量和实体变量的绑定操作合二为一了。这就比其它的算法包来得更为简洁明快,学习的曲线陡降了很多。
        CentOS 6.8下,建议按官网说明使用anaconda环境。关于cuda的安装和使用,按官网说明操作也很方便。官网http://pytorch.org/docsAPI的说明很详细,其上有很多具体的例子。
        下面是几个自动求导的示例:

第一类:纯标量

import torch
from torch.autograd import Variable

x = Variable(torch.ones(1)*3, requires_grad=True)
y = Variable(torch.ones(1)*4, requires_grad=True)
z = x.pow(2)+3*y.pow(2)     # z = x^2+3y^2, dz/dx=2x, dz/dy=6y
z.backward()   #纯标量结果可不写占位变量
print x.grad         # x = 3 时, dz/dx=2x=2*3=6
print y.grad         # y = 4 时, dz/dy=6y=6*4=24

结果:

Variable containing:
 6
[torch.FloatTensor of size 1]

Variable containing:
 24
[torch.FloatTensor of size 1]

第二类:全 1 向量

x = Variable(torch.ones(2)*3, requires_grad=True)
y = Variable(torch.ones(2)*4, requires_grad=True)
z = x.pow(2)+3*y.pow(2)
z.backward(torch.ones(2))
print x.grad
print y.grad

结果:

Variable containing:
 6
 6
[torch.FloatTensor of size 2]

Variable containing:
 24
 24
[torch.FloatTensor of size 2]

第三类:异值向量

x = Variable(torch.Tensor([1,2,3]), requires_grad=True)
y = Variable(torch.Tensor([4,5,6]), requires_grad=True)
z = x.pow(2)+3*y.pow(2)
z.backward(torch.ones(3))
print x.grad
print y.grad

结果:

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

Variable containing:
 24
 30
 36
[torch.FloatTensor of size 3]

第四类:矩阵乘法

x = Variable(torch.Tensor([[1,2,3],[4,5,6]]), requires_grad=True)
y = Variable(torch.Tensor([[1,2,3],[4,5,6]]), requires_grad=True)
z = x.mm(y.t())
z.backward(torch.ones(2,2))
print x.grad
print y.grad

结果:

Variable containing:
  7  9
  7  9
[torch.FloatTensor of size 2x3]

Variable containing:
  7  9
  7  9
[torch.FloatTensor of size 2x3]

第五类:矩阵和向量的乘法

x = Variable(torch.Tensor([[1,2,3],[4,5,6]]), requires_grad=True)
y = Variable(torch.Tensor([1,3,5]), requires_grad=True)  #单个方括号,否则视为矩阵,不能用mv函数
z = x.mv(y)
z.backward(torch.ones(2))
print x.grad
print y.grad

结果:

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

Variable containing:
 5
 7
 9
[torch.FloatTensor of size 3]

第六类:cuda. 第一次执行时似乎需要编译,会执行很长时间,大概需要3~5分钟,之后的运行会很快。

import torch
from torch.autograd import Variable

print '     --------  cuda scalar  --------'
x = Variable((torch.ones(1)*3).cuda(), requires_grad=True)
y = Variable((torch.ones(1)*4).cuda(), requires_grad=True)
z = (x.pow(2)+3*y.pow(2))
print 'z without cuda:  {0}'.format(type(z))
z = (x.pow(2)+3*y.pow(2))
z.backward()
print '\nx.type: {0}, x.grad: {1}'.format(type(x),x.grad)
print 'y.type: {0}, y.grad: {1}'.format(type(y),y.grad)
print 'z.type: {0}, z: {1}'.format(type(z),z)
 
print '     --------  cuda matrix  --------'
x = Variable(torch.Tensor([[1, 2, 3], [4, 5, 6]]).cuda(), requires_grad=True)
y = Variable(torch.Tensor([[1, 2, 3], [4, 5, 6]]).cuda(), requires_grad=True)
z = x.mm(y.t())#.cuda(0,async=True)
z.backward(torch.ones(2, 2).cuda(0,async=True))
 
print '\nx.type: {0}, x.grad: {1}'.format(type(x),x.grad)
print 'y.type: {0}, y.grad: {1}'.format(type(y),y.grad)
print 'z.type: {0}, z: {1}'.format(type(z),z)

结果:

     --------  cuda scalar  --------
z without cuda:  

x.type: , x.grad: Variable containing:
 6
[torch.cuda.FloatTensor of size 1 (GPU 0)]

y.type: , y.grad: Variable containing:
 24
[torch.cuda.FloatTensor of size 1 (GPU 0)]

z.type: , z: Variable containing:
 57
[torch.cuda.FloatTensor of size 1 (GPU 0)]

     --------  cuda matrix  --------

x.type: , x.grad: Variable containing:
 5  7  9
 5  7  9
[torch.cuda.FloatTensor of size 2x3 (GPU 0)]

y.type: , y.grad: Variable containing:
 5  7  9
 5  7  9
[torch.cuda.FloatTensor of size 2x3 (GPU 0)]

z.type: , z: Variable containing:
 14  32
 32  77
[torch.cuda.FloatTensor of size 2x2 (GPU 0)]

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
PyTorch是一个基于Python的科学计算库,它是一个用于深度学习的开源框架,具有高度灵活性和可扩展性。PyTorch的一个关键特性是它的自动微分功能,也称为自动求导功能。自动微分PyTorch中非常强大的功能,它可以自动计算函数的导数,因此可以为深度学习中的反向传播算法提供支持。 在PyTorch中,我们可以使用torch.autograd包实现自动微分。该包提供了Variable类,它是一个包装Tensor的类,它不仅保存了Tensor的值,还保存了梯度信息。我们可以在Variable上执行操作,并使用.backward()方法计算梯度。 下面是PyTorch自动微分的基本示例代码: ```python import torch x = torch.tensor([3.0], requires_grad=True) y = x ** 2 + 2 * x + 1 # 计算梯度 y.backward() # 输出梯度 print(x.grad) ``` 在这个例子中,我们定义了一个变量x,并将requires_grad设置为True,以指示PyTorch需要计算x的梯度。然后我们定义了一个函数y,该函数对x进行操作。我们使用backward()方法计算y相对于x的梯度,并使用x.grad输出梯度。 这里需要注意的是,只有requires_grad=True的变量才会被计算梯度。如果我们想要计算多个变量的梯度,可以将它们放在一个元组中,然后调用backward()方法。 ```python import torch x = torch.tensor([3.0], requires_grad=True) y = torch.tensor([4.0], requires_grad=True) z = x ** 2 + y ** 2 # 计算梯度 z.backward() # 输出梯度 print(x.grad) print(y.grad) ``` 在这个例子中,我们定义了两个变量x和y,并将requires_grad设置为True,以指示PyTorch需要计算它们的梯度。然后我们定义了一个函数z,该函数对x和y进行操作。我们使用backward()方法计算z相对于x和y的梯度,并使用x.grad和y.grad输出它们的梯度。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值