首页 PyTorch张量简介
文章
取消

PyTorch张量简介

介绍

在PyTorch中,torch.Tensor是存储和变换数据的主要工具。它是构建深度学习模型的基本数据结构,可以包含标量、向量、矩阵等。Tensor不仅支持多种数据类型,还可以在CPU和GPU之间无缝移动,这使得它在进行大规模并行计算时非常高效。Tensor是PyTorch实现机器学习算法的核心,因为它提供了必要的数据结构来存储和操作数据。

安装

1
2
# 安装torch:基础包; torchvision:视觉; torchaudio:音频;
pip install torch torchvision torchaudio

导入

1
2
3
import torch

torch.__version__
1
    '2.5.1+cu124'

创建

构造函数创建张量

1
2
3
4
# 指定形状
a = torch.Tensor(2, 3)  
print(a.dtype)
print(a)
1
2
3
    torch.float32
    tensor([[ 4.0255e-41,  0.0000e+00,  0.0000e+00],
            [ 0.0000e+00, -2.9190e+24,  4.2591e-41]])

数据直接创建张量

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 创建出来的是0维张量(也就是一个标量)
b = torch.tensor(10)
print(b.dtype)
print(b)

# 用list列表
c = torch.tensor([[1, 2, 3], [2, 3, 4]])
print(c)

# 指定数据类型
d = torch.tensor([[1, 2, 3], [2, 3, 4]], dtype=torch.float32)
print(d.dtype)
print(d)

# 包含浮点数则默认推断为torch.float32
e = torch.tensor([[1, 2.0, 3], [2, 3, 4]])  
print(e.dtype)
print(e)

1
2
3
4
5
6
7
8
9
10
    torch.int64
    tensor(10)
    tensor([[1, 2, 3],
            [2, 3, 4]])
    torch.float32
    tensor([[1., 2., 3.],
            [2., 3., 4.]])
    torch.float32
    tensor([[1., 2., 3.],
            [2., 3., 4.]])

随机创建张量

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 创建在 [0.0, 1.0) 区间内均匀分布的一组随机数张量,形状(2,3)
a = torch.rand((2, 3))
print(a)

# 创建在 [0, 9) 区间内均匀分布的一组随机数整数张量,形状(2,3)
b = torch.randint(0, 9, (2, 3))
print(b)

# 创建符合 标准正态分布(均值为0,方差为1)的随机数张量,形状(3,6)
c = torch.randn((3, 6))
print(c)
 
# 创建在 [0.0, 1.0) 区间内均匀分布的一组随机数张量,其形状与a相同。
d = torch.rand_like(a)
print(d)

# 创建在 [0, 9) 区间内均匀分布的一组随机数整数张量,其形状与c相同
e = torch.randint_like(b, 9)  
print(e)

# 创建符合 标准正态分布(均值为0,方差为1)的随机数张量,其形状与输入的c相同。
f = torch.randn_like(c)  
print(f)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
    tensor([[0.9245, 0.7784, 0.1347],
            [0.5307, 0.5987, 0.0651]])
    tensor([[7, 6, 4],
            [8, 7, 4]])
    tensor([[-0.6282,  0.9156, -0.2587, -1.0044, -0.0231,  0.2900],
            [ 0.4500,  0.0767,  0.8181, -0.5696,  1.8729, -0.3976],
            [-1.9062,  0.7666,  0.5882, -0.5821, -0.3165,  0.1443]])
    tensor([[0.7203, 0.6869, 0.9923],
            [0.1351, 0.2959, 0.6648]])
    tensor([[7, 3, 8],
            [2, 4, 7]])
    tensor([[ 1.6523,  0.4005,  1.1945,  0.0073,  0.3106, -0.1109],
            [ 1.6119, -0.6008,  1.0225, -2.1142,  0.5692,  0.1690],
            [-1.9736,  0.0629,  0.3265,  1.0271, -0.2424, -0.4625]])

规则创建张量

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 在 [0, 10) 范围内,以 2 为步长创建一维张量
a = torch.arange(0, 10, 2)
print(a)

# 在 [0, 10] 范围内,构造均匀分布的 等间距,有 5 个元素的一维张量。
b = torch.linspace(0, 10, 5)
print(b)

# 生成一个大小为 5 的一维张量, 元素值为 2^x,其中 x 是 torch.linspace() 产生的序列值。
c = torch.logspace(0, 4, 5, 2)
print(c)

# 生成一个线性张量
d = torch.linspace(0, 4, 5)
print(d)

1
2
3
4
    tensor([0, 2, 4, 6, 8])
    tensor([ 0.0000,  2.5000,  5.0000,  7.5000, 10.0000])
    tensor([ 1.,  2.,  4.,  8., 16.])
    tensor([0., 1., 2., 3., 4.])

创建特殊张量

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 创建全0张量
a = torch.zeros(3, 3)
print(a)

# 创建全1张量
b = torch.ones(3, 4)
print(b)

# 创建单位张量
c = torch.eye(4, 4)
print(c)

# 根据指定形状,填充指定数值
d = torch.full([2, 3], 6)
print(d)

# 创建一个未初始化的Tensor
e = torch.empty(5,3)
print(e)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
    tensor([[0., 0., 0.],
            [0., 0., 0.],
            [0., 0., 0.]])
    tensor([[1., 1., 1., 1.],
            [1., 1., 1., 1.],
            [1., 1., 1., 1.]])
    tensor([[1., 0., 0., 0.],
            [0., 1., 0., 0.],
            [0., 0., 1., 0.],
            [0., 0., 0., 1.]])
    tensor([[6, 6, 6],
            [6, 6, 6]])
    tensor([[1.0019e-34, 0.0000e+00, 0.0000e+00],
            [0.0000e+00, 0.0000e+00, 0.0000e+00],
            [0.0000e+00, 0.0000e+00, 2.8026e-45],
            [0.0000e+00, 1.1210e-44, 0.0000e+00],
            [1.4013e-45, 0.0000e+00, 0.0000e+00]])

创建复数张量

1
2
3
4
5
6
# 复数张量
real = torch.tensor([1, 2], dtype=torch.float32)
imag = torch.tensor([3, 4], dtype=torch.float32)
x = torch.complex(real, imag)
print(x)
print(x.dtype)
1
2
    tensor([1.+3.j, 2.+4.j])
    torch.complex64

其他

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
import numpy
# 从文件创建
t = torch.randn(2, 5, dtype=torch.float64)
t.numpy().tofile('storage.pt')
t_mapped = torch.from_file('storage.pt', shared=False, size=10, dtype=torch.float64)
print(t_mapped)

# 从numpy创建
a = numpy.array([1, 2, 3])
b = torch.from_numpy(a)
print(b)

# 外部库数据创建
import torch.utils.dlpack
t = torch.arange(4)
t2 = torch.from_dlpack(t)
t2[:2] = -1
print(t2)
print(t)

capsule = torch.utils.dlpack.to_dlpack(t)
print(capsule)

t3 = torch.from_dlpack(capsule)
print(t3)
print(t2)
print(t)
1
2
3
4
5
6
7
8
9
    tensor([ 0.7259,  0.7342,  2.2240,  0.5605, -1.1181, -0.8292, -0.6190, -1.3916,
             0.0555, -0.8264], dtype=torch.float64)
    tensor([1, 2, 3])
    tensor([-1, -1,  2,  3])
    tensor([-1, -1,  2,  3])
    <capsule object "dltensor" at 0x76bae8011bf0>
    tensor([-1, -1,  2,  3])
    tensor([-1, -1,  2,  3])
    tensor([-1, -1,  2,  3])

属性

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 是否开启梯度(requires_grad)
x = torch.zeros(1, requires_grad=True)
# with torch.no_grad():
y = x * 2
print(y.requires_grad)

# 梯度值
z = torch.tensor([[1., -1.], [1., 1.]], requires_grad=True)
out = z.pow(2).sum()
out.backward()
print(z.grad)

# 转置
t = torch.tensor([[1,2,3],[4,5,6]])
print(t)
print(t.T)
1
2
3
4
5
6
7
8
    True
    tensor([[ 2., -2.],
            [ 2.,  2.]])
    tensor([[1, 2, 3],
            [4, 5, 6]])
    tensor([[1, 4],
            [2, 5],
            [3, 6]])

设备

torch.device 是 PyTorch 中用于表示计算设备(如CPU或GPU)的类。它允许你在代码中指定你希望在哪个设备上执行张量和模型操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# 设备

# 创建第一个GPU设备对象,第一张显卡
torch.device('cuda:0')

# 创建一个CPU设备对象
torch.device('cpu')

# 创建第一个GPU设备对象
torch.device('cuda')

# 创建一个CPU设备对象
cpu_device = torch.device("cpu")

# 创建第一个GPU设备对象
gpu_device = torch.device("cuda:0")

# 创建一个CPU张量
tensor_cpu = torch.tensor([1, 2, 3])
# 将张量移动到CPU上
tensor_cpu = tensor_cpu.to(cpu_device)

# 创建一个模型
# model = MyModel()

# 移到GPU上
# model = model.to(gpu_device)

参考资料

1、PyTorch手册

2、PyTorch–Tensor的创建

本文由作者按照 CC BY 4.0 进行授权

PyTorch常用模块简介

Linux免密登录