欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

PyTorch学习系列(四)——Tensor 和 Variable

程序员文章站 2022-07-12 23:08:40
...

Tensor

PyTorch中的Tensor本质上和numpy数组是一样的:Tensor是一个n维数组,并且PyTorch定义了关于Tensor的很多操作。并且Tensor和numpy一样,不知道深度学习、计算图和梯度的概念,它们都是通用的科学计算工具。但是和numpy不同的是,Torch可以利用GPU来加速数值计算。

Variable

如果用numpy或者Tensor来实现神经网络,需要手动写出前向过程和反向过程。对于简单的网络,反向过程中的导数容易求得,但是随着网络深度以及网络复杂度的增加,求出梯度的解析表达式是非常困难的。

PyTorch的包autograd提供了自动求导的功能。当使用autograd时,定义的前向网络会生成一个计算图:每个节点是一个Tensor,边表示由输入Tensor到输出Tensor的函数。沿着计算图的反向传播可以很容易地计算出梯度。

在实现的时候,用到了Variable对象。Variable对Tensor对象进行封装,只需要Variable::data即可取出Tensor,并且Variable还封装了该Tensor的梯度Variable::grad(是个Variable对象)。现在用Variable作为计算图的节点,则通过反向传播自动求得的导数就保存在Variable对象中了。

Variable提供了和Tensor一样的API,即能在Tensor上执行的操作也可以在Variable上执行。

定义

神经网络的输入也是Variable类型的,但是并不需要对其求导。requires_grad控制着是否在反向传播过程中对该节点求梯度:

input = Variable(torch.randn(N, D_in).type(torch.TensorFloat), requires_grad=False)#默认值是False

参考

[1] https://github.com/jcjohnson/pytorch-examples