从PyTorch官方的一篇教程说开去(6.2 - 张量 tensor 矩阵运算等)

您的进步和反馈是我写作最大的动力,小伙伴来个三连呗!共勉~

话不多说,书接上文,需要温习的小伙伴请移步 - 从PyTorch官方的一篇教程说开去(6.1 - 张量 tensor 基本操作)-CSDN博客

借图镇楼 - 

1 - 矩阵乘法(点积或外积,整个行乘以整个列):

shape = (4,4)
ones_tensor = torch.ones(shape)
y1 = ones_tensor @ ones_tensor
print(f"{y1}\n")

shape = (4,4)
ones_tensor = torch.ones(shape)
y2 = torch.matmul(ones_tensor,ones_tensor.T)
print(f"{y2}\n")

z1 = torch.rand_like(y1)
torch.matmul(ones_tensor, ones_tensor.T, out=z1)
print(f"{z1}\n")
  • 使用 @ 符号,等同于调用matmul函数,进行矩阵乘法。由于 ones_tensor 是一个 4x4 的全1矩阵,其与自身的乘法结果将是一个元素为4的矩阵。ones_tensor.T 表示转置。用out 参数,可以就地执行矩阵乘法,结果存储在 z1 中。这样可以避免额外的内存分配。

2 - 元素级别的点乘(dot product):

y3 = ones_tensor * ones_tensor
print(f"{y3}\n")

y4 = torch.mul(ones_tensor,ones_tensor.T)
print(f"{y4}\n")

z2 = torch.rand_like(y3)
torch.mul(ones_tensor,ones_tensor.T,out=z2)
  • 元素级别的点乘,也就是逐元素相乘。对于全1矩阵,结果是每个元素都是1。同上例,提供3种算符。

3 - torch没有官方定义叉乘(Cross Product):

# 定义两个三维向量
vector_a = torch.tensor([1.0, 2.0, 3.0])
vector_b = torch.tensor([4.0, 5.0, 6.0])

# 计算叉乘
cross_product = torch.linalg.cross(vector_a, vector_b)

print(f"Vector A: {vector_a}")
print(f"Vector B: {vector_b}")
print(f"Cross Product: {cross_product}")
  • 尽管官方没有,但是为了区别这几个容易混淆的概念,我们还是配个例子。叉乘(Cross Product)通常是针对两个三维向量而言的,它返回一个向量,该向量垂直于原来的两个向量,并遵循右手定则。

4 - 单元素张量:

agg = ones_tensor.sum()
agg_item = agg.item()
print(agg_item,type(agg_item))
  •  ones_tensor 是一个 4x4 的单位矩阵,其元素总和将是 4x4=16。item() 方法用于将这个张量转换成一个 Python 标量(即一个单一数值)。在进行一些扁平化的操作时候会用到。

5 - 就地计算函数(为节约存储,这些都很常用):

原地操作函数(in-place operations) 以_结尾
add_(): 原地加法。
sub_(): 原地减法。
mul_(): 原地乘法。
div_(): 原地除法。

copy_(): 原地复制。
t_(): 原地转置。
fill_(): 原地填充。
zero_(): 原地清零。

clamp_(): 原地限制值。
clamp_min_(): 原地最小值限制。
clamp_max_(): 原地最大值限制。

sum_(): 原地求和。
mean_(): 原地求平均值。
std_(): 原地求标准差。
var_(): 原地求方差。
norm_(): 原地求范数。
renorm_(): 原地重规范化。

addmm_(): 原地矩阵乘法加法。
addr_(): 原地地址加法。
addbmm_(): 原地二维矩阵乘法加法。
baddbmm_(): 原地批量二维矩阵乘法加法。
mm_(): 原地矩阵乘法。
bmm_(): 原地批量矩阵乘法。

ger_(): 原地外积。
linalg_vector_norm_(): 原地向量范数。
linalg_matrix_norm_(): 原地矩阵范数。
linalg_solve_(): 原地线性求解。
linalg_inv_(): 原地矩阵求逆。
linalg_pinv_(): 原地伪逆。
linalg_eig_(): 原地特征值分解。
linalg_svd_(): 原地奇异值分解。
linalg_householder_product_(): 原地Householder变换。
linalg_qr_(): 原地QR分解。
linalg_triangular_solve_(): 原地三角求解。
linalg_cholesky_(): 原地Cholesky分解。
linalg_symeig_(): 原地对称特征值分解。
linalg_eigvals_(): 原地特征值计算。
linalg_eigvalsh_(): 原地Hermitian特征值计算。
linalg_slogdet_(): 原地对数行列式。
linalg_det_(): 原地行列式。
linalg_cond_(): 原地条件数。
linalg_matrix_rank_(): 原地矩阵秩。
linalg_solve_triangular_(): 原地三角求解。
linalg_lstsq_(): 原地最小二乘求解。

6 - 打印结果和类型:

np_array = np.array(data)
x_np = torch.from_numpy(np_array)

print(f"{x_np}\n")
x_np.add_(1)
print(np_array,"\n")

n = np.ones(5)
t = torch.from_numpy(n)
np.add(n,1,out=n)
print(f"{t} \n{n}")
  •  
  • 这里就地展示一下上个小标题的原地计算函数,add_() 是就地操作,它将 1 加到张量 x_np 的每个元素上。注意,由于 x_np 和 np_array 共享内存,np_array 也会被修改。我们还一同展示了如何在数组和张量之间进行互相转化。
  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值