Pytorch Tensor和Variable的区别
PyTorch是一个开源的Python库,用于机器学习、计算机视觉和深度学习。它是一个出色的库,用于构建神经网络,进行复杂的计算和优化梯度差异。
由Facebook的研究团队(FAIR)开发,由于其动态计算图的特性,它可以实时改变图形。这在2016年的时候是革命性的,当时实时模型刚刚开始流行。
在PyTorch中,有两个主要的变量,即tensor和variable。
Tensor是用于定义n维矩阵或多维数组的数据结构,这些矩阵和数组在数学运算中使用。它们代表了许多类型的数组,如标量、向量和n维数组。它们具有与NumPy数组或Tensorflow张量类似的功能。PyTorch张量支持自动微分,对于神经网络中的反向传播来改善精度和减少错误非常重要。它们用于存储和操作PyTorch中的数据。
步骤
- 导入PyTorch。
- 定义一个列表。
- 将列表转换为张量。
- 打印张量。
示例
import torch
lst=[1,2,3,4,5]
tensor=torch.tensor(lst)
print(tensor)
输出
tensor([1,2,3,4,5])
Variable
它们是PyTorch中的主要数据类型。在更新到PyTorch 0.4.0之前,它们用于封装张量并提供自动微分和跟踪计算图。变量在被弃用之前主要用于部署基于梯度的优化算法。在PyTorch更新到0.4.0之后,它的大部分功能与张量合并了。现在,张量可以在没有变量的情况下执行所有这些功能,因此不再使用变量。废弃变量的主要原因是为了减少PyTorch API的复杂性,减少张量和变量之间的混淆。
步骤
- 导入PyTorch
-
从PyTorch导入变量。
-
创建一个简单的列表。
-
将变量函数转换为张量后进行封装。
-
打印变量。
示例
import torch
from torch.autograd import Variable
lst=[1,2,3,4,5]
var=Variable(torch.tensor(lst))
print(var)
输出
tensor([1,2,3,4,5])
让我们通过更复杂的例子来了解张量和变量的用法,并亲自看看:
使用Tensor的示例
众所周知,所有的程序都是通过计算机的CPU运行的。为了大大加快计算时间,我们可以利用GPU(图形处理单元)的能力来运行程序。
注意:如果你使用的是Google Colab,请将运行时更改为GPU运行时,否则程序将抛出错误。
步骤
- 从PyTorch导入张量。
-
创建两个浮点数据类型的张量。
-
找到它们的总和并打印出来。
-
使用cuda()函数进行GPU加速。
-
打印所有的GPU加速。
示例
import torch
from torch import tensor, cuda
#为了防止程序抛出错误
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
t1=tensor(6.)
t2=tensor(9.)
res=t1+t2
print(res)
if cuda.is_available():
t1=t1.cuda()
print(t1)
t2=t2.cuda()
print(t2)
res=t1+t2
print(res)
输出
tensor(15.)
tensor(6., device='cuda:0')
tensor(9., device='cuda:0')
tensor(15., device='cuda:0')
带有Variable的示例
为了在给定的函数中执行微分,我们使用grad函数。通过计算输入的计算图,返回一个Python函数作为其导数,与返回代数导数的传统微分不同。
在这里,我们在结果变量上执行反向传播后返回我们的变量函数,其中计算梯度,梯度将不会计算,导致微分返回为“None”。
步骤
- 导入PyTorch。
-
从PyTorch导入Variable。
-
使用Variable函数将两个张量包装起来。
-
要找到梯度类型,需要设置’requires_grad’=True。
-
找到两个张量的总和。
-
将结果传递给网络的后面来计算梯度。
-
打印两个张量的梯度值。
示例
import torch
from torch.autograd import Variable
var1 = Variable(torch.tensor(6.), requires_grad=True)
var2 = Variable(torch.tensor(9.), requires_grad=True)
result = var1 + var2
print(result)
result.backward()
print(var1.grad)
print(var2.grad)
输出
tensor(15., grad_fn=<AddBackward07>)
tensor(1.)
tensor(1.)
结论
在PyTorch 0.4.0之前,变量和张量具有不同的功能。变量被用来包装一个多维张量以进行求导。然而,在最新版本的更新中,PyTorch不再需要使用变量,这使它们过时了。