📅  最后修改于: 2023-12-03 15:19:37.204000             🧑  作者: Mango
Pytorch是一种优秀的深度学习框架,其中的张量(Tensor)和变量(Variable)是两种常用的数据类型。
张量是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
变量是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中,我们通常使用变量来进行模型的训练和优化,而使用张量来进行数据的处理和计算。