注:本代码在jupyter notebook上运行
封面图片来源
1 标量
import torch
x = torch.tensor(3.0)
y = torch.tensor(2.0)
x + y, x * y, x / y, x**y # 加 乘 除 指数运算
输出结果:
(tensor(5.), tensor(6.), tensor(1.5000), tensor(9.))
2 向量
x = torch.arange(4)
x
输出结果:
tensor([0, 1, 2, 3])
# 引用向量的元素
x[3]
输出结果:
tensor(3)
# 向量长度
len(x)
输出结果:
4
# 形状
x.shape
输出结果:
torch.Size([4])
3 矩阵
A = torch.arange(20).reshape(5, 4)
A
输出
# 访问矩阵的转置
A.T
输出
输出
# 对称阵的转置是其本身
B = torch.tensor([[1, 2, 3], [2, 0, 4], [3, 4, 5]])
B == B.T
输出
4 张量
# 张量是向量的推广,是描述具有任意数量轴的n维数组的方法
X = torch.randn(24).reshape(2, 3, 4)
X
输出
5 张量算法的基本性质
具有相同形状的张量,进行按元素二元运算的结果是相同形状的张量
A = torch.arange(20, dtype=torch.float32).reshape(5, 4)
B = A.clone() # 通过分配新内存,将A的副本分配给B
A, A+B
输出
A * B
输出
# 张量与标量相乘或相加:张量的每个元素都与该标量相乘或相加
X = torch.arange(24).reshape(2, 3, 4)
a = 2.5
print()
print(X, '\n', a + X, '\n', a*X)
输出
6 降维
# 对任意张量计算其元素和
x = torch.arange(4, dtype=torch.float32)
x, x.sum()
输出
# 计算任意形状张量的元素和
A.shape, A.sum()
输出
默认情况下该求和函数会沿所有轴降低张量维度 我们也可以指定轴求和降维
# 指定axis=0
A_sum_axis0 = A.sum(axis = 0)
A_sum_axis0, A_sum_axis0.shape
输出
# 指定axis=1
A_sum_axis1 = A.sum(axis = 1)
A_sum_axis1, A_sum_axis1.shape
输出
# 沿着行和列求和,结果与A.sum()相同
A.sum(axis=[0, 1])
输出
# 求平均值的两种方法
A.mean(), A.sum()/A.numel() # 求平均值的函数,总和/元素个数
输出
# 亦可沿指定轴求平均值降维
A.mean(axis = 0), A.sum(axis = 0)/A.shape[0]
输出
非降维求和或求平均值,轴数保持不变
sum_A = A.sum(axis=1, keepdim=True)
print(sum_A)
print(sum_A.shape,A.shape)
输出
# 由于sum_A对每行求和后仍保持两个轴,可以通过广播机制将A除以sum_A
A / sum_A
# 沿某轴计算A的累积总和,可调用cumsum函数,该函数不会降低输入张量的维度
A, A.cumsum(axis=0) # 沿行累计求和,我们看第一列
# 4=0+4
# 12=0+4+8
# 24=0+4+8+12
# 40=0+4+8+12+16
输出
7 点积
# 求点积的两种方法
y = torch.ones(4, dtype=torch.float32)
x, y, torch.dot(x, y) # 直接调用函数
输出
torch.sum(x * y)# 按元素乘法再求和
输出
8 矩阵-向量积
# A的列维数(沿轴1长度),必须与x的长度相同
A.shape,x.shape, torch.mv(A, x)
9 矩阵-矩阵乘法
# 不要和哈达玛积(矩阵按元素乘法)混淆
B = torch.ones(4,3)
torch.mm(A,B)
输出
10 范数
L1范数:向量元素的绝对值之和
L2范数:向量元素平方和的平方根
# 向量的L2范数(欧几里得距离)
u = torch.tensor([3.0, -4.0])
torch.norm(u) # 类似求直角三角形的斜边
输出
# 相较于L2范数, L1范数受异常值的影响较小
# 求解方法:绝对值函数+按元素求和
torch.abs(u).sum()
输出
L1和L2范数是更一般的Lp范数(向量绝对值的p次方和的p次方根)
弗罗贝尼乌兹范数:矩阵元素的平方和的平方根
torch.norm(torch.ones((4,9)))
输出
本人学习地址https://zh-v2.d2l.ai/
恳请大佬批评指正。