数据操作
2024-09-27 14:57:26 # 深度学习入门 # 预备知识
入门
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import torch
# 1.创建一个行向量
x = torch.arrange(10)
# 2.得到一个tensor的形状
x.shape
# 3.得到一个tensor的元素总数
x.numel()
#从轴0开始计算的tensor中x的元素数
len(x)
y = torch.ones(2,2)
print(len(y)) # 2
print(y.numel()) # 4
# 4.改变一个tensor的形状
y1 = x.reshape(3,4)
y2 = x.reshape(-1, 4)
y3 = x.reshape(3, -1)
# 5.创建一个全0 tensor
torch.zeros([2,3,4])
# 6.创建一个全1 tensor
torch.ones([2,3,4])
# 7.创建一个符合标准正态分布的tensor
torch.randn(3,4)
# 8.创建一个指定数值的tensor
torch.tensor([[1,2,3],[4,5,6]])

运算符

+,-, *, / 等基本运算符的操作的对象都是按位进行的

1
2
3
4
5
6
7
8
9
# 以自然数e作为底数,对张量x进行求幂运算,最后得到一个新的张量
torch.exp(x)
# 对两个张量进行拼接操作
torch.cat((x, y), dim = 0) # 按行拼接(在张量为二阶时)
torch.cat((x, y), dim = 1) # 按列拼接
#使用逻辑运算符对两个张量进行运算,得到一个含0,1的新张量
x == y
#对张量中的所有元素求和,注意这会将张量降维成为一个标量!
x.sum()
广播机制

对于两个不同维度的张量进行运算符操作,会使用广播机制 按列优先对于tensor进行扩充,目的是为了保持tensor维度的一致

例: x = [3, 1] y = [1, 2] 最后的运算结果z 会变为[3,2]的矩阵

pytorch 官网中对于可以广播的条件的解释: Broadcasting semantics — PyTorch 2.4 documentation

简单来说,广播机制需要满足以下条件:

  1. 其中一个张量的维数不能为0
  2. 从最后一个维度开始(即从右往左数),依次对比每个张量的维度,它们必须满足以下条件中的一个,否则就会被视为不可广播的:
    1. 其中一个维度为1
    2. 两个维度相同
    3. 有一个维度不存在

对于广播机制的空间化理解:Pytorch中的广播机制(Broadcast)_pytorch广播机制-CSDN博客

索引和切片
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#使用[0]访问第一个元素,使用[-1]访问最后一个元素
x = torch.arrange(12).reshape(2,3,2)
x[0] #x中的每个元素会被视为矩阵
x[-1]
#使用索引进行进行精准访问
x[0,2,1] = 1

#使用符号 a:b 进行切片, 切片范围前闭后开, 如果没有选择范围,则为全选
y = x[0:1, 0:2, :]

#使用[a,b,c]获取切片
x = torch.arange(36).float().reshape(-1,4)
y = torch.tensor([0,1,2])
print(x[y])#打印的结果是x中的第0,1,2行(因为x是一个矩阵)

#高级索引
y = torch.tensor([0, 2])
y_hat = torch.tensor([[0.1, 0.3, 0.6], [0.3, 0.2, 0.5]])
y_hat[[0, 1], y]#首先选中的是y_hat的0,1行,然后选中0,2列
就地更新

使用运算符默认会为运算结果分配一个新的地址空间,并将引用指向它,为了实现就地跟新,可以:

  1. 使用 x[:] = x + y
  2. 使用 += 符号, 例: x += y