📜  Pytorch中张量和变量的区别(1)

📅  最后修改于: 2023-12-03 15:19:37.204000             🧑  作者: Mango

Pytorch中张量和变量的区别

Pytorch是一种优秀的深度学习框架,其中的张量(Tensor)和变量(Variable)是两种常用的数据类型。

张量(Tensor)

张量是Pytorch中最基本的数据类型,它类似于NumPy中的多维数组,但是可以在GPU上进行加速运算。Pytorch中的张量可以是一维到任意维的,可以包含整数、浮点数以及复数等不同类型的数值。

创建张量

我们可以使用torch.Tensor()方法从列表中创建张量:

import torch

a = torch.Tensor([[1, 2], [3, 4]])
print(a)

输出结果:

tensor([[1., 2.],
        [3., 4.]])

也可以使用torch.zeros()方法创建全零张量:

b = torch.zeros((2, 3))
print(b)

输出结果:

tensor([[0., 0., 0.],
        [0., 0., 0.]])
张量的运算

与NumPy类似,我们可以对张量进行各种运算:

c = torch.Tensor([[5, 6], [7, 8]])
print(a + c)
print(a - c)
print(a * c)
print(torch.matmul(a, c))
print(torch.mean(a))

输出结果:

tensor([[ 6.,  8.],
        [10., 12.]])
tensor([[-4., -4.],
        [-4., -4.]])
tensor([[ 5., 12.],
        [21., 32.]])
tensor([[19., 22.],
        [43., 50.]])
tensor(2.5000)
张量的属性

每个张量都有自己的尺寸、类型和其他属性:

print(a.size())    # 返回张量的尺寸
print(a.dtype)     # 返回张量的类型
print(a.device)    # 返回张量所在的设备,例如cpu或cuda等

输出结果:

torch.Size([2, 2])
torch.float32
cpu
变量(Variable)

变量是Pytorch中深度学习的核心概念,主要用于自动求导。变量在计算图中充当了节点的角色,记录了每个操作的历史。

创建变量

我们可以使用torch.autograd.Variable()方法创建变量,并且告诉Pytorch需要对这个变量记录梯度:

x = torch.autograd.Variable(torch.Tensor([2]), requires_grad=True)
y = torch.autograd.Variable(torch.Tensor([3]), requires_grad=True)
z = x + y
print(z)

输出结果:

tensor([5.], grad_fn=<ThAddBackward>)
变量的属性

变量和张量很相似,也有自己的尺寸、类型和其他属性:

print(z.size())     # 返回变量的尺寸
print(z.dtype)      # 返回变量的类型
print(z.device)     # 返回变量所在的设备,例如cpu或cuda等
print(z.grad_fn)    # 返回变量的梯度函数

输出结果:

torch.Size([1])
torch.float32
cpu
<ThAddBackward object at 0x7f1bfd78be10>
变量的求导

当我们定义了一个变量之后,我们可以调用其backward()方法来自动求导:

z.backward()
print(x.grad)    # 输出x的梯度
print(y.grad)    # 输出y的梯度

输出结果:

tensor([1.])
tensor([1.])

从上面的输出中可以看出,对于z = x + y而言,z的梯度为1,x和y的梯度也分别为1。

张量和变量的区别

可以发现,张量和变量非常相似,它们都可以进行各种运算,并且都有自己的属性(如尺寸、类型和设备等)。但是它们之间还是有一些区别的:

  • 变量实现了自动求导的功能,而张量没有。
  • 在进行深度学习中,我们通常使用变量来存储模型的参数(例如权重和偏置),而不是使用张量。

因此,在Pytorch中,我们通常使用变量来进行模型的训练和优化,而使用张量来进行数据的处理和计算。