标量
标量——仅包含一个数值,由只有一个元素的张量表示
变量——未知的标量值
例,将华氏度值转换为摄氏度的计算表达式,其中5、9、32为标量,c和f为变量。
实例化两个标量并进行算术运算
import torch
x = torch.tensor(3.0)
y = torch.tensor(2.0)
print(x + y, x * y, x / y, x ** y)
#结果
#tensor(5.) tensor(6.) tensor(1.5000) tensor(9.)
向量
向量——标量值组成的列表,用一维张量表示,默认为列向量
向量的元素或分量——组成向量的标量值,通过张量的索引来访问
向量或轴的维度——向量或轴的长度,即向量的元素数量
张量的维度——张量具有的轴数
张量的某个轴的维数就是这个轴的长度。
x=torch.arange(4)
print(x)
print(x[3])
print(len(x))#向量的长度
print(x.shape)#也可通过shape属性访问
#结果
#tensor([0, 1, 2, 3])
#tensor(3)
#4
#torch.Size([4])
矩阵
A = torch.arange(6).reshape(3, 2)#创建3×2的矩阵
print(A)
print(A.T)#矩阵的转置
#结果
#tensor([[0, 1],
# [2, 3],
# [4, 5]])
#tensor([[0, 2, 4],
# [1, 3, 5]])
对称矩阵——方阵的特殊类型,B=BT
B = torch.tensor([[1, 2, 3], [2, 0, 4], [3, 4, 5]])
print(B)
print(B==B.T)
#结果
#tensor([[1, 2, 3],
# [2, 0, 4],
# [3, 4, 5]])
#tensor([[True, True, True],
# [True, True, True],
# [True, True, True]])
矩阵中的行向量更多对应于数据样本,列对应于样本的不同属性。
矩阵-向量积(mv函数)
a=torch.arange(2,dtype=torch.float32)
print(A.shape, a.shape)
print(torch.mv(A, a))#A的列维数(沿轴1的长度)必须与x的维数(其长度)相同
#结果
#torch.Size([3, 2]) torch.Size([2])
#tensor([1., 3., 5.])
矩阵乘法(mm函数)
注意与Hadamard积(下文有介绍)区分开
B = torch.ones(2, 3)
print(torch.mm(A, B))
#结果
#tensor([[1., 1., 1.],
# [5., 5., 5.],
# [9., 9., 9.]])
张量
X = torch.arange(12).reshape(2, 3, 2)#创建具有两个轴的张量
print(X)
#结果
#tensor([[[ 0, 1],
# [ 2, 3],
# [ 4, 5]],
#
# [[ 6, 7],
# [ 8, 9],
# [10, 11]]])
张量算法的基本性质
任何按元素的一元运算都不会改变其操作数的形状。
具有相同形状的任意两个张量按元素二元运算的结果都将是相同形状的张量。
A = torch.arange(6, dtype=torch.float32).reshape(3, 2)
B = A.clone() # 通过分配新内存,将A的一个副本分配给B
print(A)
print(A + B)
#结果
#tensor([[0., 1.],
# [2., 3.],
# [4., 5.]])
#tensor([[ 0., 2.],
# [ 4., 6.],
# [ 8., 10.]])
print(A * B)
#结果
#tensor([[ 0., 1.],
# [ 4., 9.],
# [16., 25.]])
张量乘以或加一个标量,其形状不会改变,其每个元素都与标量相加或相乘。
a = 2
X = torch.arange(12).reshape(2, 3, 2)
print(a + X)
print((a * X).shape)
#结果
#tensor([[[ 2, 3],
# [ 4, 5],
# [ 6, 7]],
#
# [[ 8, 9],
# [10, 11],
# [12, 13]]])
#torch.Size([2, 3, 2])
降维
求和降维:默认情况下,调用求和函数会沿所有的轴降低张量的维度,使其变为一个标量。
也可以指定张量沿哪一个轴通过求和降低维度。
A_sum_axis0 = A.sum(axis=0)#对矩阵A的0轴所有元素求和
print(A_sum_axis0, A_sum_axis0.shape)
A_sum_axis1 = A.sum(axis=1)#对所有列(轴1)降维
print(A_sum_axis1, A_sum_axis1.shape)
print(A.sum(axis=[0,1])==A.sum())#沿着行和列对矩阵求和,等价于对矩阵的所有元素进行求和
#结果
#tensor([6., 9.]) torch.Size([2])#矩阵沿0轴降维,生成输出向量,输入轴0的维数在输出形状中消失
#tensor([1., 5., 9.]) torch.Size([3])
#tensor(True)
计算平均值:总和除以元素总数。计算平均值的函数也可以沿指定轴降低张量的维度。
print(A.mean(), A.sum()/A.numel())
#结果
#tensor(2.5000) tensor(2.5000)
print(A.mean(axis=0), A.sum(axis=0) / A.shape[0])#沿指定轴降低维度
#结果
#tensor([2., 3.]) tensor([2., 3.])
非降维求和
有些情况下,求和和均值时保持轴数不变会更有用。比如可以通过广播将A除以sum_A。
sum_A=A.sum(axis=1,keepdim=True)
print(sum_A)
print(A/sum_A)
#结果
#tensor([[1.],
# [5.],
# [9.]])
#tensor([[0.0000, 1.0000],
# [0.4000, 0.6000],
# [0.4444, 0.5556]])
cumsum函数:沿某个轴计算元素的累积总和,不会降低输入张量的维度。
print(A.cumsum(axis=0))
#结果
#tensor([[0., 1.],
# [2., 4.],
# [6., 9.]])
# 0+2+4, 1+3+5
点积
torch.dot():相同位置的按元素乘积的和
y=torch.ones(4,dtype=torch.float32)
print(x,y)
print(torch.dot(x.float(),y))# dot的两个参数的数据类型要相同。x的数据类型原本为Long,需要转化为float类型。
#结果
#tensor([0, 1, 2, 3]) tensor([1., 1., 1., 1.])
#tensor(6.)
也可以通过执行按元素乘法,然后求和来表示两个向量的点积。
print(torch.sum(x * y))
#结果
#tensor(6.)
范数
范数——表示一个向量的大小(不涉及维度,是分量的大小)
u = torch.tensor([3.0, -4.0])
print(torch.norm(u))
#结果
#tensor(5.)
print(torch.abs(u).sum())
#结果
#tensor(7.)
print(torch.norm(torch.ones((4, 9))))
#结果
#tensor(6.)
标签:tensor,sum,torch,张量,print,Pytorch,线性代数,2.3,True
From: https://blog.csdn.net/fbhc_4444X_/article/details/136666595