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

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

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

借图镇楼 -

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

python 复制代码
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):

python 复制代码
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):

python 复制代码
# 定义两个三维向量
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 - 单元素张量:

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

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

python 复制代码
原地操作函数(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 - 打印结果和类型:

python 复制代码
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_npnp_array 共享内存,np_array 也会被修改。我们还一同展示了如何在数组和张量之间进行互相转化。
相关推荐
量子-Alex24 分钟前
【目标检测】【PANet】Path Aggregation Network for Instance Segmentation
人工智能·目标检测·计算机视觉
lihuayong27 分钟前
计算机视觉:经典数据格式(VOC、YOLO、COCO)解析与转换(附代码)
人工智能·yolo·目标检测·计算机视觉·目标跟踪·coco·数据标注
thinkMoreAndDoMore32 分钟前
深度学习(3)-TensorFlow入门(常数张量和变量)
开发语言·人工智能·python
神舟之光34 分钟前
动手学深度学习2025.2.23-预备知识之-线性代数
人工智能·深度学习·线性代数
wapicn991 小时前
‌挖数据平台对接DeepSeek推出一键云端部署功能:API接口驱动金融、汽车等行业智能化升级
java·人工智能·python·金融·汽车·php
不爱学习的YY酱1 小时前
MusicGPT的本地化部署与远程调用:让你的Windows电脑成为AI音乐工作站
人工智能·windows
kakaZhui1 小时前
【多模态大模型】端侧语音大模型minicpm-o:手机上的 GPT-4o 级多模态大模型
人工智能·chatgpt·aigc·llama
艾思科蓝 AiScholar1 小时前
【SPIE出版,见刊快速,EI检索稳定,浙江水利水电学院主办】2025年物理学与量子计算国际学术会议(ICPQC 2025)
图像处理·人工智能·信息可视化·自然语言处理·数据分析·力扣·量子计算
liruiqiang051 小时前
机器学习 - 衡量模型的特性
人工智能·机器学习
thinkMoreAndDoMore1 小时前
深度学习(3)-TensorFlow入门(梯度带)
人工智能·深度学习·tensorflow