Tensor基础2——张量的计算

1. 张量的数值计算

1)张量基本运算
  • 加减乘除取负号:
  • add、sub、mul、div、neg
  • add_(其中带下划线的版本会修改原数据)
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
29
30
31
32
33
data = torch.randint(0, 10, [2, 3])
print(data)
>>> tensor([[3, 7, 4],
[0, 0, 6]])

# 1. 不修改原数据
new_data = data.add(10) # 等价 new_data = data + 10
print(new_data)
>>> tensor([[13, 17, 14],
[10, 10, 16]])

# 2. 直接修改原数据 注意: 带下划线的函数为修改原数据本身
data.add_(10) # 等价 data += 10
print(data)
>>> tensor([[13, 17, 14],
[10, 10, 16]])

# 3. 其他函数
print(data.sub(100))
>>> tensor([[-87, -83, -86],
[-90, -90, -84]])

print(data.mul(100))
>>> tensor([[1300, 1700, 1400],
[1000, 1000, 1600]])

print(data.div(100))
>>> tensor([[0.1300, 0.1700, 0.1400],
[0.1000, 0.1000, 0.1600]])

print(data.neg())
>>> tensor([[-13, -17, -14],
[-10, -10, -16]])
2)张量点乘运算
  • 点乘指(Hadamard)的是两个同维矩阵对应位置的元素相乘,使用mul 和运算符 * 实现。
image-20240528102236446
1
2
3
4
5
6
7
8
9
10
11
12
13
data1 = torch.tensor([[1, 2], [3, 4]])
data2 = torch.tensor([[5, 6], [7, 8]])
# 第一种方式
data = torch.mul(data1, data2)
print(data)
>>> tensor([[ 5, 12],
[21, 32]])

# 第二种方式
data = data1 * data2
print(data)
>>> tensor([[ 5, 12],
[21, 32]])
3)张量矩阵乘法运算
  • 矩阵乘法运算要求第一个矩阵 shape: (n, m),第二个矩阵 shape: (m, p), 两个矩阵点积运算 shape 为: (n, p)。
  • 运算符 @ 用于进行两个矩阵的乘积运算
  • torch.matmul 对进行乘积运算的两矩阵形状没有限定.对数输入的 shape 不同的张量, 对应的最后几个维度必须符合矩阵运算规则
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 点积运算
data1 = torch.tensor([[1, 2], [3, 4], [5, 6]])
data2 = torch.tensor([[5, 6], [7, 8]])
# 方式一:
data3 = data1 @ data2
print("data3-->", data3)
>>> data3--> tensor([[19, 22],
[43, 50],
[67, 78]])

# 方式二:
data4 = torch.matmul(data1, data2)
print("data4-->", data4)
>>> data4--> tensor([[19, 22],
[43, 50],
[67, 78]])
4)总结

<1> 张量基本运算函数

  • add、sub、mul、div、neg等函数
  • add_、sub_、mul_、div_、neg_等函数

<2> 张量的点乘运算

  • mul 和运算符 *

<3> 点积运算

  • 运算符@用于进行两个矩阵的点乘运算
  • torch.matmul 对进行点乘运算的两矩阵形状没有限定,对数输入的 shape 不同的张量, 对应的最后几个维度必须符合矩阵运算规则

2. 张量的运算函数

PyTorch 为每个张量封装很多实用的计算函数:

  • 均值
  • 平方根
  • 求和
  • 指数计算
  • 对数计算等等
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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
import torch

data = torch.randint(0, 10, [2, 3], dtype=torch.float64)
print(data)
>>> tensor([[4., 0., 7.],
[6., 3., 5.]], dtype=torch.float64)

# 1. 计算均值
# 注意: tensor 必须为 Float 或者 Double 类型
print(data.mean())
>>> tensor(4.1667, dtype=torch.float64)

print(data.mean(dim=0)) # 按列计算均值
>>> tensor([5.0000, 1.5000, 6.0000], dtype=torch.float64)

print(data.mean(dim=1)) # 按行计算均值
>>> tensor([3.6667, 4.6667], dtype=torch.float64)

# 2. 计算总和
print(data.sum())
>>> tensor(25., dtype=torch.float64)

print(data.sum(dim=0))
>>> tensor([10., 3., 12.], dtype=torch.float64)

print(data.sum(dim=1))
>>> tensor([11., 14.], dtype=torch.float64)

# 3. 计算平方
print(torch.pow(data,2))
>>> tensor([[16., 0., 49.],
[36., 9., 25.]], dtype=torch.float64)

# 4. 计算平方根
print(data.sqrt())
>>> tensor([[2.0000, 0.0000, 2.6458],
[2.4495, 1.7321, 2.2361]], dtype=torch.float64)

# 5. 指数计算, e^n 次方
print(data.exp())
>>> tensor([[5.4598e+01, 1.0000e+00, 1.0966e+03],
[4.0343e+02, 2.0086e+01, 1.4841e+02]], dtype=torch.float64)

# 6. 对数计算
print(data.log()) # 以 e 为底
>>> tensor([[1.3863, -inf, 1.9459],
[1.7918, 1.0986, 1.6094]], dtype=torch.float64)

print(data.log2())
>>> tensor([[2.0000, -inf, 2.8074],
[2.5850, 1.5850, 2.3219]], dtype=torch.float64)

print(data.log10())
>>> tensor([[0.6021, -inf, 0.8451],
[0.7782, 0.4771, 0.6990]], dtype=torch.float64)

Tensor基础2——张量的计算
https://linxkon.github.io/Tensor基础2--张量的计算.html
作者
linxkon
发布于
2021年2月12日
许可协议