向量(一阶张量)的范数就是向量的长度。
矩阵范数 :将一个矩阵映射成一个数字(也叫矩阵的长度)
要求:
1.0矩阵的长度为0
2.非零矩阵长度均大于0
3.满足数乘运算,即 a ∣ ∣ A ∣ ∣ = ∣ ∣ a A ∣ ∣ a||A||=||aA|| a∣∣A∣∣=∣∣aA∣∣
4.满足三角不等式,即 ∣ ∣ A + B ∣ ∣ ≤ ∣ ∣ A ∣ ∣ + ∣ ∣ B ∣ ∣ ||A+B||\le||A||+||B|| ∣∣A+B∣∣≤∣∣A∣∣+∣∣B∣∣,注意 A , B A,B A,B是同型矩阵
5.只对于方阵进行范数定义则需要满足相容性,即 ∣ ∣ A B ∣ ∣ ≤ ∣ ∣ A ∣ ∣ ∣ ∣ B ∣ ∣ ||AB||\le||A||||B|| ∣∣AB∣∣≤∣∣A∣∣∣∣B∣∣
范数定义方式:
弗罗贝尼乌斯范数 Frobenius Norm:
矩阵元素平方和开根号,在Pytorch中直接使用torch.norm()函数就可以求得Frobenius范数
L1范数(针对于向量):
每个元素的绝对值(求绝对值时要用到torch.abs()函数)求和
服从乘法范数:
对于向量 c , b c,b c,b和矩阵 A A A若 c = A b c=Ab c=Ab则 ∣ ∣ c ∣ ∣ ≤ ∣ ∣ A ∣ ∣ ∣ ∣ b ∣ ∣ ||c||\le||A||||b|| ∣∣c∣∣≤∣∣A∣∣∣∣b∣∣(表达式中的 ∣ ∣ A ∣ ∣ ||A|| ∣∣A∣∣是一个标量),将矩阵的范数定义为满足该式的最小 ∣ ∣ A ∣ ∣ ||A|| ∣∣A∣∣
哈达玛积 Hadamard Product:
两个同型矩阵的哈达玛积为对应元素相乘(结果仍为一个矩阵)。
下文定义的X Tensor对应的三维图像(利于理解文中的sum()函数与cumsum()函数):
指定求和汇总张量的轴(类中的sum()函数):
x = torch.arange(30).reshape((3, 2, 5))
print(x)
##########x的输出为################
tensor([[[ 0, 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]]])
##################################
# !!!!!!!!type1!!!!!!!!!!!
y = x.sum(axis = 0)
print(y.shape)
print(y)
# torch.Size([2, 5])
# tensor([[30, 33, 36, 39, 42],
# [45, 48, 51, 54, 57]])
#!!!!!!!!!type2!!!!!!!!!!!
y = x.sum(axis=1)
print(y.shape)
print(y)
# torch.Size([3, 5])
# tensor([[ 5, 7, 9, 11, 13],
# [25, 27, 29, 31, 33],
# [45, 47, 49, 51, 53]])
#!!!!!!!!!type3!!!!!!!!!!!
y = x.sum(axis=2)
print(y.shape)
print(y)
# torch.Size([3, 2])
# tensor([[ 10, 35],
# [ 60, 85],
# [110, 135]])
# !!!!!!!type3!!!!!!!!!
y = x.sum(axis=[0, 1])
print(y.shape)
print(y)
# torch.Size([5])
# tensor([75, 81, 87, 93, 99])
理解:
sum的功能是将axis指向的维度压缩后舍弃,如果不想该维度被舍弃需要使用keepdims=True这个参数(默认值为False)
某个轴计算x元素的累积求和(类中的cumsum()函数)
x = torch.arange(30).reshape((3, 2, 5))
print(x)
##########x的输出为################
tensor([[[ 0, 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]]])
##################################
#!!!!!!type1!!!!!!!!!
y = x.cumsum(axis=0)
print(y.shape)
print(y)
# torch.Size([3, 2, 5])
# tensor([[[ 0, 1, 2, 3, 4],
# [ 5, 6, 7, 8, 9]],
#
# [[10, 12, 14, 16, 18],
# [20, 22, 24, 26, 28]],
#
# [[30, 33, 36, 39, 42],
# [45, 48, 51, 54, 57]]])
#!!!!!!type2!!!!!!!!
y = x.cumsum(axis=1)
print(y.shape)
print(y)
# torch.Size([3, 2, 5])
# tensor([[[ 0, 1, 2, 3, 4],
# [ 5, 7, 9, 11, 13]],
#
# [[10, 11, 12, 13, 14],
# [25, 27, 29, 31, 33]],
# [[20, 21, 22, 23, 24],
# [45, 47, 49, 51, 53]]])
# !!!!!!type3!!!!!!!!!!
y = x.cumsum(axis=2)
print(y.shape)
print(y)
# torch.Size([3, 2, 5])
# tensor([[[ 0, 1, 3, 6, 10],
# [ 5, 11, 18, 26, 35]],
#
# [[ 10, 21, 33, 46, 60],
# [ 15, 31, 48, 66, 85]],
#
# [[ 20, 41, 63, 86, 110],
# [ 25, 51, 78, 106, 135]]])
理解:
面的话是从前往后依次累积求和,行的话是从上往下依次累积求和,列的话是从左往右依次累积求和,且维度与形状均不发生任何改变。